Вывод: start, promise constructor, final, promise1, promise3, promise4, timeout. Обработчик promise и второй catch с promise2 пропускаются.
console.log('start'); //
Вывод: start, promise constructor, final, promise1, promise3, promise4, timeout. Обработчик promise и второй catch с promise2 пропускаются.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
console.log('start'); //
setTimeout(() => console.log('timeout'), 0); //
new Promise((resolve, reject) => { console.log('promise constructor'); // reject(); }) .then(() => console.log('promise')) // .catch(() => console.log('promise1')) // .catch(() => console.log('promise2')) // .then(() => console.log('promise3')) // .then(() => console.log('promise4')); //
console.log('final'); //
Ответ
Вывод: start, promise constructor, final, promise1, promise3, promise4, timeout. Обработчик promise и второй catch с promise2 пропускаются.
Executor выполняется сразу и отклоняет Promise. После завершения синхронного кода первый catch обрабатывает rejection и возвращает undefined, поэтому дальнейшая цепочка становится успешной. Оба последующих then выполняются как микрозадачи раньше таймера. Нулевой timeout не означает немедленное выполнение.