> Что будет, если убрать await из функции delay? (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Дом.рф
Стек: JavaScript
> Пример ответа
Короткий ответ
Если убрать await из вызова delay, функция продолжит выполнение синхронно, не дожидаясь завершения промиса. Это приведёт к тому, что код после вызова выполнится раньше, чем завершится таймер. Сам промис останется в состоянии pending и будет выполнен позже, но его результат не будет использован. В большинстве случаев это логическая ошибка, которая ломает порядок выполнения асинхронных операций.
Подробное объяснение
await приостанавливает выполнение асинхронной функции до тех пор, пока промис не перейдёт в состояние fulfilled или rejected. Без await вызов delay() просто создаёт промис и возвращает его, но не блокирует выполнение. Функция продолжает работать дальше, а промис "висит" в event loop.
Ключевой момент: если delay возвращает промис, а вы его не ждёте, то:
- код после вызова выполнится немедленно (синхронно до первого
awaitили до конца функции); - ошибки внутри промиса не будут перехвачены
try/catchвокруг вызова; - порядок операций нарушится - последующий код может использовать данные, которые ещё не готовы.
Это особенно опасно в цепочках зависимостей: если следующий шаг зависит от результата delay, вы получите undefined или ошибку.
На практике
На практике это часто встречается в обработчиках событий, инициализации приложения или при работе с API. Например:
JAVASCRIPTasync function init() {delay(1000) // забыли awaitconsole.log('Инициализация завершена') // выполнится сразу}
Пользователь увидит сообщение раньше, чем пройдёт задержка. Если внутри delay происходит загрузка данных, они не будут доступны к моменту логирования.
Также без await теряется обработка ошибок: если промис отклоняется, исключение станет unhandled rejection, что в строгих окружениях (Node.js, современные браузеры) приведёт к падению процесса или ошибке в консоли.
Пример кода
JAVASCRIPTfunction 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 1swithoutAwait() // start → end immediately → (через 1с промис резолвится, но никто его не ждёт)
Как отвечать на собеседовании
Начните с краткого определения: await приостанавливает выполнение до резолва промиса. Затем объясните последствия: нарушение порядка, потеря результата, unhandled rejection. Приведите пример из практики - например, инициализацию данных. Подчеркните, что это не синтаксическая ошибка, а логическая, которую сложно отладить. Если спросят про void или fire-and-forget - упомяните, что иногда это осознанный паттерн, но тогда нужно явно обрабатывать ошибки через .catch().
Что проверяет интервьюер
Интервьюер оценивает:
- понимание асинхронности и event loop;
- умение объяснить разницу между синхронным и асинхронным выполнением;
- знание последствий для обработки ошибок;
- способность привести реальный сценарий, где это ломает логику;
- внимательность к деталям - многие кандидаты говорят "просто не подождёт", но не упоминают unhandled rejection.
Типичные ошибки
- Утверждение, что код "упадёт" - на самом деле он просто выполнится в неправильном порядке.
- Игнорирование проблемы с ошибками: без
awaitошибка не попадёт вtry/catch. - Предложение использовать
return delay()вместоawait delay()- это работает только если функция ничего не делает после вызова. - Забывают упомянуть, что промис всё равно выполнится, просто результат будет потерян.
> Похожие задачи по frontend
Как сделать, чтобы форма сабмитилась один раз и возвращала данные через функцию
Что такое паттерн делегирования событий в JavaScript
Что такое JavaScript
Можно ли передать функцию как аргумент в другую функцию в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью