Почему второй Promise может обогнать второй then первого?

Вывод: sync, P1-a, P2, P1-b. Второй then первой цепочки ещё не готов в момент регистрации: его реакция ставится после завершения P1-a, когда P2 уже ожидает в очереди.

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

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

Вывод: sync, P1-a, P2, P1-b. Второй then первой цепочки ещё не готов в момент регистрации: его реакция ставится после завершения P1-a, когда P2 уже ожидает в очереди.

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

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

Условие

Определите вывод:

Promise.resolve().then(() => console.log('P1-a'))
  .then(() => console.log('P1-b'));
Promise.resolve().then(() => console.log('P2'));
console.log('sync');

Ответ

Вывод: sync, P1-a, P2, P1-b. Второй then первой цепочки ещё не готов в момент регистрации: его реакция ставится после завершения P1-a, когда P2 уже ожидает в очереди.

Нельзя считать всю Promise-цепочку одной неделимой микрозадачей. Каждое звено становится доступным после результата предыдущего. Поэтому две независимые цепочки могут чередоваться. Если P1-a возвращал бы другой ожидаемый Promise, продолжение могло бы отложиться ещё сильнее; здесь callback только печатает строку.

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

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

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

Подробнее