Определение последовательности вывода в консоль при работе с Promise и setTimeout

Порядок сообщений: 1, 5, 3, 2, 4. Executor Promise синхронный, а then выполняется до очереди таймеров.

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

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

Порядок сообщений: 1, 5, 3, 2, 4. Executor Promise синхронный, а then выполняется до очереди таймеров.

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

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

Условие

Укажите порядок появления сообщений в консоли при выполнении следующего JavaScript‑кода:

function demo() {
  const promiseObj = new Promise((resolve) => {
    console.warn('1');
    setTimeout(() => console.warn('2'));
    resolve('');
  });

  promiseObj.then(() => {
    console.warn('3');
    setTimeout(() => console.warn('4'));
  });

  console.warn('5');
}

demo();

Ответ

Порядок сообщений: 1, 5, 3, 2, 4. Executor Promise синхронный, а then выполняется до очереди таймеров.

При вызове demo конструктор сразу печатает 1 и регистрирует таймер 2. После присоединения then синхронно печатается 5.

Микрозадача then выводит 3 и только тогда создаёт таймер 4. Таймер 2 был зарегистрирован раньше, поэтому с одинаковой задержкой выполняется первым. console.warn вместо console.log не меняет порядок исполнения JavaScript, хотя интерфейс консоли может отдельно оформлять предупреждения.

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

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

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

Подробнее