Журнал консоли не определен после получения API в Vue

При извлечении из API (сторонняя сторона, я аутентифицируюсь и получаю данные в своем контроллере Laravel) я получаю «неопределенное» в консоли. Я хочу хранить данные в компоненте Vue.

Я пробовал кучу разных вещей, в том числе get вместо fetch, но это также не определено. Я провел некоторое исследование и прочитал о функциях стрелок, но я не использую функцию стрелок.

data() {
    return {
        tickets: [],
    };
},

created() {
    this.fetchTickets();
},

methods: {
    fetchTickets() {
        fetch('/api')
        .then(res => {
            this.tickets = res.json;
        })
        .then(res => {
            console.info(res.json);
        }) 
    }
}

Итак, мне нужна коллекция, созданная из запроса на получение, который я отправляю стороннему API в PHP, который возвращается на маршрут /api, хранящийся в моем компоненте Vue. Теперь он просто регистрирует undefined.

РЕДАКТИРОВАТЬ Бэкэнд-запрос в PHP

 $response = $client->get('v1/tickets/search.json', [
        'query' => ['statuses[]' => 'active', 'assignedTo[]' => 314955, 
        'sortDir' => 'desc', 'sortBy' => 'updatedAt']
    ]);

    $json = (string)$response->getBody()->getContents();
    $decoded = json_decode($json, true);
    return collect($decoded);

Маршрут: Route::get('/api', 'ApiController@getTickets',);

Ты забыл вернуться из своего первого тогда return res

Juan Mendes 09.04.2019 14:14

Возможный дубликат Почему значение undefined в .then() привязано к Promise?

Ivar 09.04.2019 14:22
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
1 560
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Верните свои данные, прежде чем переходить ко второму обещанию.

fetchTickets() {
    fetch('/api')
    .then(res => {
        this.tickets = res.json;
        return res;
    })
    .then(res => {
        console.info(res.json);
    }); 

По какой-то причине в console.info все еще написано undefined

Scott van Duin 09.04.2019 14:22

@ScottvanDuin Объяснил логику ответа. Сначала вам нужно вернуть res.json(), а затем вы получите объект json.

Ashish 09.04.2019 14:25

добавить оператор return в первое обещание

fetch('/api')
  .then(res => {
      return res.json();
   })
   .then(tickets => {
     // tickets is a local variable scoped only here
     console.info(tickets);
   }) 

Билеты нигде не определены, это просто ошибки: «app.js: 1792 Uncaught (в обещании) ReferenceError: билеты не определены в app.js: 1792»

Scott van Duin 09.04.2019 14:22

ticket — это локальная переменная во второй области обещания, вы не должны делать ее глобально доступной, потому что вы полагаетесь на некоторый асинхронный код для заполнения значения

Karim 09.04.2019 14:30

Но тогда как именно это будет храниться в data() компонента? (Я новичок в vue и javascript на этом уровне)

Scott van Duin 09.04.2019 14:32

какова цель метода data(), разве вы не можете просто передавать билеты при вызове data(tickets)?

Karim 09.04.2019 15:41

Таким образом, я могу смонтировать свойство, которое будет передано другому компоненту, я буду использовать данные из API более одного раза, поэтому я не хочу получать данные по отдельности в каждом компоненте.

Scott van Duin 09.04.2019 16:22

Хорошо, тогда вы можете установить билеты глобально или, возможно, лучшим подходом будет использование внешней библиотеки управления состоянием.

Karim 09.04.2019 16:51
Ответ принят как подходящий

fetch возвращает обещание, содержащее ответ res. (Это просто ответ HTTP, а не фактический JSON.)

Чтобы извлечь содержимое тела JSON из ответа, мы используем метод json()

Вы можете прочитать больше о используя выборку.

fetchTickets() {
    fetch('/api')
    .then(res => res.json()) //returning a promise To extract the JSON body content from the response
    .then(resJson => {
        this.tickets = resJson
        console.info(resJson);
    }) 
}

Информация, которую я получил от API, теперь корректно регистрируется в консоли! Спасибо!

Scott van Duin 09.04.2019 14:26

О, у меня есть еще один вопрос, как определяется resJson? .then просто передает содержимое res => res.json()?

Scott van Duin 10.04.2019 09:35

Другие вопросы по теме