> Что будет, если убрать await из функции delay? (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Дом.рф

Стек: JavaScript

> Пример ответа

Короткий ответ

Если убрать await из вызова delay, функция продолжит выполнение синхронно, не дожидаясь завершения промиса. Это приведёт к тому, что код после вызова выполнится раньше, чем завершится таймер. Сам промис останется в состоянии pending и будет выполнен позже, но его результат не будет использован. В большинстве случаев это логическая ошибка, которая ломает порядок выполнения асинхронных операций.

Подробное объяснение

await приостанавливает выполнение асинхронной функции до тех пор, пока промис не перейдёт в состояние fulfilled или rejected. Без await вызов delay() просто создаёт промис и возвращает его, но не блокирует выполнение. Функция продолжает работать дальше, а промис "висит" в event loop.

Ключевой момент: если delay возвращает промис, а вы его не ждёте, то:

  • код после вызова выполнится немедленно (синхронно до первого await или до конца функции);
  • ошибки внутри промиса не будут перехвачены try/catch вокруг вызова;
  • порядок операций нарушится - последующий код может использовать данные, которые ещё не готовы.

Это особенно опасно в цепочках зависимостей: если следующий шаг зависит от результата delay, вы получите undefined или ошибку.

На практике

На практике это часто встречается в обработчиках событий, инициализации приложения или при работе с API. Например:

JAVASCRIPT
async function init() {
delay(1000) // забыли await
console.log('Инициализация завершена') // выполнится сразу
}

Пользователь увидит сообщение раньше, чем пройдёт задержка. Если внутри delay происходит загрузка данных, они не будут доступны к моменту логирования.

Также без await теряется обработка ошибок: если промис отклоняется, исключение станет unhandled rejection, что в строгих окружениях (Node.js, современные браузеры) приведёт к падению процесса или ошибке в консоли.

Пример кода

JAVASCRIPT
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms))
}
async function withAwait() {
console.log('start')
await delay(1000)
console.log('end after 1s')
}
async function withoutAwait() {
console.log('start')
delay(1000) // await убран
console.log('end immediately')
}
withAwait() // start → (пауза 1с) → end after 1s
withoutAwait() // start → end immediately → (через 1с промис резолвится, но никто его не ждёт)

Как отвечать на собеседовании

Начните с краткого определения: await приостанавливает выполнение до резолва промиса. Затем объясните последствия: нарушение порядка, потеря результата, unhandled rejection. Приведите пример из практики - например, инициализацию данных. Подчеркните, что это не синтаксическая ошибка, а логическая, которую сложно отладить. Если спросят про void или fire-and-forget - упомяните, что иногда это осознанный паттерн, но тогда нужно явно обрабатывать ошибки через .catch().

Что проверяет интервьюер

Интервьюер оценивает:

  • понимание асинхронности и event loop;
  • умение объяснить разницу между синхронным и асинхронным выполнением;
  • знание последствий для обработки ошибок;
  • способность привести реальный сценарий, где это ломает логику;
  • внимательность к деталям - многие кандидаты говорят "просто не подождёт", но не упоминают unhandled rejection.

Типичные ошибки

  • Утверждение, что код "упадёт" - на самом деле он просто выполнится в неправильном порядке.
  • Игнорирование проблемы с ошибками: без await ошибка не попадёт в try/catch.
  • Предложение использовать return delay() вместо await delay() - это работает только если функция ничего не делает после вызова.
  • Забывают упомянуть, что промис всё равно выполнится, просто результат будет потерян.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью