Определение порядка вывода в консоль (пример 60)

Как написано, вывода нет: функция run только объявлена. Если вызвать run(), порядок будет 1, 'Promise', 4, 'timeOut', '777', 'then1', 'then2', 'timeOut2'.

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

Что ответить на собеседовании

Как написано, вывода нет: функция run только объявлена. Если вызвать run(), порядок будет 1, 'Promise', 4, 'timeOut', '777', 'then1', 'then2', 'timeOut2'.

Подробный разбор

Ответ с пояснениями

Условие

Определите, в какой последовательности будут напечатаны сообщения в консоль:

const run = () => {
    setTimeout(() => {
        console.log('timeOut');
    }, 0);
    console.log(1);
    new Promise(resolve => {
        console.log('Promise');
        setTimeout(() => {
            console.log('777');
            resolve();
        }, 0);
    })
    .then(() => {
        console.log('then1');
    })
    .then(() => {
        console.log('then2');
    });
    console.log(4);
    setTimeout(() => {
        console.log('timeOut2');
    }, 0);
};

Ответ

Как написано, вывода нет: функция run только объявлена. Если вызвать run(), порядок будет 1, 'Promise', 4, 'timeOut', '777', 'then1', 'then2', 'timeOut2'.

Executor Promise печатает Promise синхронно. После завершения run сначала выполняется первый таймер timeOut, затем таймер с 777 и resolve. Разрешение Promise ставит then1, а затем then2 в очередь микрозадач; они выполняются до следующего таймера timeOut2. Нельзя ставить все таймеры перед всеми then без учёта того, какой таймер разрешает конкретный Promise.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее