Насколько я понимаю, обещание в выражении await promise
помещается в очередь микрозадач, поэтому оно будет установлено после того, как стек вызовов станет пустым. Приведенный ниже код работает так, как я ожидал:
async function func() {
console.info(await Promise.resolve('bagel'));
}
func();
console.info('synchronous log');
// Result:
// synchronous log
// bagel
Но если я await
что-то не промис такой, то порядок логов менялся:
async function func() {
await console.info('bagel');
}
func();
console.info('synchronous log');
// Result:
// bagel
// synchronous log
Что происходит за кадром, когда я звоню await
? Каков порядок выполнения при ожидании не-промиса? А конкретно await console.info
?
«Насколько я понимаю, обещание помещается в очередь микрозадач» — нет, очередь задач не содержит обещаний. Задача (обработчик .then()
), которая возобновляет выполнение функции async
, помещается в очередь микрозадач после разрешения промиса.
В вашем случае у вас есть
async function func() {
let un = console.info('bagel');
await un;
}
func();
console.info('synchronous log');
Так что порядок очевиден
В случае
async function func() {
await 0;
console.info('bagel');
}
func();
console.info('synchronous log');
синхронный тоже будет первым, так как await
приостанавливает выполнение функции
Если вы хотите, чтобы ваше «синхронное» ожидание было синхронным, вы не должны ждать его, если это не обещание.
async function func(wait) {
if (wait?.then) {
await wait
}
}
await console.info(…)
не имеет смысла, это то же самое, чтоconsole.info(…); await undefined;
. Вы наверное имели ввидуconsole.info(await 'bagel')
?