#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
метод, но все равно безуспешно..