Ответный ответ.данные не обещают результата в Javascipt

#javascript #axios

Вопрос:

Я пытаюсь использовать axios для запросов API. Мой код выглядит так.

   const trigger = async () => {
    for (const [key, value] of Object.entries(data)) {
      if (value.name == source){
        return await axios.get("http://localhost:8000/api/" value.someid).then(
          (response) => response.data
        );
      }
    }
  }
  
  console.log(trigger())

 

Здесь я пытаюсь найти конечную точку для некоторого идентификатора. И я получил обещанный результат в console.log.
Я подумал, что должен получить response.data не все обещание. Почему это так?

Редактировать

Все еще получаю все обещание с помощью этого кода 🙁

   const trigger = async () => {
    for (const [key, value] of Object.entries(data)) {
      if (value.name == source){
        const response = await axios.get("http://localhost:8000/api/" value.someid);
        return response.data;
      }
    }
  }
  console.log(trigger())
 

Комментарии:

1. trigger().then(data => console.log(data)) . Все обещания должны быть выполнены или ожидаться, если вы хотите получить их результат.

2. Большое спасибо! Все еще получаю тот же результат с приведенным выше кодом 🙁

3. ваша trigger функция, по определению, возвращает обещание — это то, что async функции ВСЕГДА возвращают, это в описании — используйте ожидание или .затем trigger()

Ответ №1:

В своем вопросе вы выходите из функции триггера без использования ключевого слова await, поэтому ожидаемый результат для console.log(триггер()) будет обещанием.

решение

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

проверьте приведенный ниже код, я использовал API Starwars для моделирования вопроса.

 const trigger = async () => {
let response;
for (const [key, value] of Object.entries([1, 2, 3, 4, 5])) {
  if (value === 2) {
    console.log('passed');
    response = await axios.get(`https://swapi.dev/api/people/${value}`);
  }
 }
 return response;
};
const getData = async () => {
  const response = await trigger();
  console.log(response);
};
 

вот пример кода реакции в stack blitz

Ответ №2:

Вам нужно await trigger() или нужно .then подождать, пока Обещание разрешится. Кроме того, я бы рекомендовал использовать либо async/await, либо Promise.then (), а не комбинировать их:

 const response =  await axios.get("http://localhost:8000/api/" value.someid);
return response.data;
 

или

 return axios.get("http://localhost:8000/api/" value.someid).then(
  (response) => response.data
);
 

Комментарии:

1. Привет, большое спасибо! Но я все равно получаю тот же результат. Я добавил отредактированный код выше. Что там все еще не так?

2. Вы должны await своим звонком вызвать: console.log(await trigger());

3. Еще раз спасибо! Я пытался, но я получаю эту ошибку Unexpected reserved word 'await'

4. используйте await в async функции … или использовать trigger.then(result => console.log(result)) — потому что нет способа «использовать» асинхронный результат синхронно

5. @Браво, Спасибо! Новый код в разделе Edit использует ожидание в функции (я все еще делаю что-то не так?). Я попробовал .then метод, но все равно безуспешно..