#javascript #async-await #axios
#javascript #асинхронный-ожидание #axios
Вопрос:
Я относительно новичок в js и пытаюсь разобраться с async-await. Мне не хватает чего-то фундаментального. Я хочу сделать HTTP GET, который блокируется до тех пор, пока ответ не будет готов. Я создал приведенный ниже код, ожидая, что он будет напечатан:
main1 false «Некоторые данные» main2
вместо этого он печатает:
main1 true неопределенный main2
Как я могу разрешить это встроенное обещание?
const axios = require('axios');
'use strict'
let URLs= ["http://blah"];
main(process.argv)
function main(argv) {
console.log('main1');
const resp = httpgetimpl(URLs[0]);
console.log(resp instanceof Promise);
console.log(resp.data);
console.log('main2');
}
async function httpgetimpl(url) {
const resp = await axios.get(url);
return resp;
}
Комментарии:
1.
await
не делает ничего синхронным. Это упрощает написание асинхронного кода. Тем не менее, просто сделайтеmain
async function
также иawait
обещание, которое вы получили.2. Если вы
console.log(resp.data);
используете метод httpgetimpl() , вы вообще что-нибудь получаете?3.
'use strict'
должен быть первый оператор (в файле или функции), который вступит в силу4. @Ricardo Sanchez console.log(соотв.данные); => выводит ответ, но после main2
5. Попробуйте
return await axios.get(url);
Ответ №1:
Невозможно сделать асинхронную операцию (например, HTTP-запрос) синхронной в JS (в node наверняка есть синхронные API, но это не JS — это среда выполнения C)
Название await
ключевого слова немного вводит в заблуждение, но это не означает «остановить выполнение всей программы здесь и ничего не делать, пока операция не завершится». Это означает «вернуть поток выполнения моему вызывающему (вернув обещание), и когда ожидаемая операция будет завершена, перезвоните мне и начните выполнение следующей строки»
Это просто синтаксический сахар для обещаний…
Ваша программа переписана с использованием Promises:
function httpgetimpl(url) {
return axios.get(url).then((resp) =>
// do something with response if you want
return resp;
)
}
function main(argv) {
console.log('main1');
const response = httpgetimpl(URLs[0]).then((resp) =>
{
// noop
})
// following statements are executed before the axios GET request finishes..
console.log(response instanceof Promise); // true
console.log(response.data); // undefined
console.log('main2');
}
… надеюсь, вы понимаете, почему он выводит то, что вы видите
Если вы сделаете свой main
async
и измените вызов на const resp = await httpgetimpl(URLs[0]);
это, это код, использующий обещания:
function httpgetimpl(url) {
return axios.get(url).then((resp) =>
// do something with response if you want
return resp;
)
}
function main(argv) {
console.log('main1');
return httpgetimpl(URLs[0]).then((resp) =>
{
console.log(resp instanceof Promise);
console.log(resp.data);
console.log('main2');
})
}
… который должен выводить ожидаемое