Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: await, async, Promise, event loop, microtask queue

Что делает оператор await и как он взаимодействует с event loop?

Вопрос проверяет понимание асинхронного выполнения кода в JavaScript, в частности, как оператор await приостанавливает выполнение функции до разрешения Promise, не блокируя основной поток благодаря event loop.

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

Оператор await приостанавливает выполнение асинхронной функции до тех пор, пока переданный ему Promise не будет разрешён (fulfilled) или отклонён (rejected). При этом он не блокирует основной поток выполнения, потому что управление возвращается в event loop, который может обрабатывать другие задачи. Когда Promise разрешается, выполнение функции возобновляется с того места, где оно было приостановлено. Это позволяет писать асинхронный код, который выглядит как синхронный, упрощая его чтение и поддержку.

Длинный ответ

Ключевое слово await используется внутри функций, объявленных с async. Его основная задача — заставить интерпретатор JavaScript "ждать" разрешения Promise, но делать это неблокирующим образом.

Как работает приостановка

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

Взаимодействие с Event Loop

Event Loop — это механизм, который управляет выполнением кода, обрабатывая очередь задач (task queue) и очередь микрозадач (microtask queue). Когда выполнение асинхронной функции приостанавливается на await, движок помещает микрозадачу (microtask) в очередь микрозадач. Эта микрозадача содержит код, который должен возобновиться после разрешения Promise.

  • Event Loop продолжает выполнять синхронный код, который следует после вызова асинхронной функции.
  • Когда Call Stack (стек вызовов) становится пустым, Event Loop проверяет очередь микрозадач.
  • Если Promise, на котором стоит await, разрешается, соответствующая микрозадача извлекается из очереди и выполняется, возобновляя приостановленную функцию с результатом Promise.

Практический пример

Рассмотрим простой пример с задержкой и запросом данных.

async function fetchData() {
    console.log('Начинаем запрос...');
    // Имитируем асинхронный запрос с задержкой
    const data = await new Promise(resolve => {
        setTimeout(() => resolve('Данные получены'), 1000);
    });
    console.log(data); // Выполнится после разрешения Promise
    return data;
}

console.log('До вызова функции');
fetchData();
console.log('После вызова функции');

// Вывод в консоли:
// До вызова функции
// Начинаем запрос...
// После вызова функции
// (через 1 секунду) Данные получены

В этом примере, когда выполнение доходит до await, функция fetchData приостанавливается, и управление возвращается, позволяя выполниться console.log('После вызова функции'). Через секунду Promise разрешается, микрозадача для возобновления fetchData попадает в очередь, и когда Call Stack пуст, Event Loop выполняет её, выводя "Данные получены".

Обработка ошибок

Если Promise, переданный в await, отклоняется (rejects), это приводит к выбросу исключения в точке await. Это исключение можно перехватить с помощью try...catch внутри асинхронной функции.

async function riskyOperation() {
    try {
        const result = await Promise.reject('Что-то пошло не так!');
    } catch (error) {
        console.error('Ошибка перехвачена:', error);
    }
}

Итог: Оператор await — это синтаксический сахар для работы с Promise, который делает асинхронный код более линейным и читаемым. Его стоит применять везде, где нужно последовательно выполнять асинхронные операции, не блокируя при этом основной поток, например, при работе с API, чтении файлов или выполнении любых других I/O-задач.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    4

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#await

#async

#Promise

#event loop

#microtask queue

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.