В документации MDN говорится, что
Когда вызывается асинхронная функция, она возвращает обещание. Когда асинхронная функция возвращает значение, обещание будет разрешено с возвращенным значением. Когда асинхронная функция генерирует исключение или какое-либо значение, Promise будет отклонен с брошенным значением.
Следовательно, что я делаю неправильно, учитывая, что await
ожидает выполненного обещания?
foo();
async function foo(){
await bar();
zoo();
}
async function bar(){
setTimeout(() => {
console.log("bar");
return;
}, 1000);
}
function zoo(){
console.log("zoo");
}
Согласно тому, что я (ошибочно) понял, он должен сначала регистрировать bar
, а затем zoo
, но он регистрирует наоборот.
РЕДАКТИРОВАТЬ: Теперь, благодаря разъяснениям @Matt Morgan, я понимаю ошибку, поскольку функция bar()
возвращает undefined
. Тем не менее, я думал, что один только вызов функции async
per se заставит функцию немедленно вернуть неразрешенное обещание и что такое обещание будет разрешено, когда функция async
вернет любое значение (даже неопределенное). Но теперь я понимаю, что действительно нужно вернуть обещание самому, объявив его с помощью оператора return Promise
. Я думаю, что статья MDN для async
, которую я все прочитал, немного сбивает с толку по этой теме (только мое мнение).
Поэтому я мог бы просто изменить свою bar()
функцию на:
function bar(){
return new Promise(function(resolve){
setTimeout(() => {
console.log("bar");
resolve();
}, 1000);
});
}
resolveAfter2Seconds
, затем сравните его с вашим bar (). Заметили что-нибудь? - person   schedule 05.02.2018Promise
, если функция async уже возвращаетPromise
, просто запустивreturn;
. В документации сказано, что когда вызывается асинхронная функция, она возвращает обещание. Когда асинхронная функция возвращает значение, обещание будет разрешено с возвращенным значением. - person João Pimentel Ferreira   schedule 05.02.2018:)
- person João Pimentel Ferreira   schedule 06.02.2018bar
сразу возвращаетundefined
. Он не ждет (и не может) ждать окончания тайм-аута. Чтобы это сработало, вы должны сами построить обещание. - person Felix Kling   schedule 07.02.2018bar
сразу возвращается, если яreturn
после истечения тайм-аута? 2) если он не может дождаться истечения тайм-аута, зачем мне функцияasync
? Просто чтобы вставитьawait
звонка? - person João Pimentel Ferreira   schedule 07.02.2018return
не выходит за границы функций. Вы возвращаетесь только внутри обратного вызова. Функция вернется к вызывающему. Но вы не вызываете обратный вызов, браузер вызовет функцию, когда истечет время ожидания. Сам вызовsetTimeout
немедленно возвращается. Это не блокирует. 2) Если вы явно создаете и возвращаете обещание, асинхронность вам не нужна. Если вы хотите использовать ожидание внутри функции, вам понадобится async. - person Felix Kling   schedule 08.02.2018