Что будет, если убрать await из функции delay?
Что проверяют
Понимаете ли вы, что асинхронная функция всегда возвращает промис, и что await меняет не саму работу, а порядок, в котором продолжится ваш код. Вопрос с подвохом: ответ зависит от того, откуда именно убрали await, и интервьюер ждёт уточняющего вопроса.
Как отвечать
Сначала уточнить: убрали у вызова или внутри самой обёртки.
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
async function run() {
console.log("старт");
await delay(1000);
console.log("финиш");
}Убрали await у вызова: delay(1000) всё равно выполнится, таймер заведётся, но run ждать не станет. «финиш» напечатается сразу, а промис самой run выполнится раньше, чем сработает таймер. Промис от delay остаётся висеть без обработчика: если он отклонится, получится необработанное отклонение, а try/catch вокруг вызова ничего не поймает.
Убрали await внутри обёртки вида async function delay(ms) { await new Promise(...) }: функция сразу возвращает выполненный промис, ожидание исчезает вовсе, и ломается уже любой вызывающий код.
Полезно добавить, что await не блокирует поток: он ставит продолжение функции в микрозадачу и отдаёт стек дальше. И что ждать можно любое значение, не только промис: await 5 тоже отложит продолжение до микрозадачи.
Где спотыкаются
Говорят «код станет синхронным». Нет: таймер по-прежнему асинхронный, просто его никто не ждёт, меняется лишь порядок вывода.
Второе: не замечают лишней обёртки. async function delay(ms) { return new Promise(...) } возвращает промис из промиса, это лишние такты микрозадач и путаница в стектрейсах. Здесь async не нужен.
Третье: убирают await в цикле «ради параллельности» и теряют и порядок, и ошибки. Если нужна параллельность, промисы собирают в массив и отдают в Promise.all или Promise.allSettled.