Вывод: start, sync, after. Функция приостанавливается на незавершённом Promise; таймер разрешает его позже, после чего продолжение попадает в микрозадачи.
Когда продолжится async-функция после таймера
Вывод: start, sync, after. Функция приостанавливается на незавершённом Promise; таймер разрешает его позже, после чего продолжение попадает в микрозадачи.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите вывод:
async function run() {
console.log('start');
await new Promise(resolve => setTimeout(resolve, 0));
console.log('after');
}
run();
console.log('sync');
Почему after не печатается сразу?
Ответ
Вывод: start, sync, after. Функция приостанавливается на незавершённом Promise; таймер разрешает его позже, после чего продолжение попадает в микрозадачи.
Async-функция сразу возвращает Promise вызывающему коду. Таймер не блокирует поток и не обещает точную задержку в ноль миллисекунд. Если вместо resolve в callback возникнет необработанное исключение, оно не превратится автоматически в отклонение этого Promise; для ошибок асинхронной операции нужно вызвать reject.