Сначала выведется 2, затем 1. Первый catch обрабатывает брошенное значение 2 и восстанавливает успешную цепочку; следующий then возвращает Promise.resolve(1).
Результат выполнения цепочки Promise в консоли
Сначала выведется 2, затем 1. Первый catch обрабатывает брошенное значение 2 и восстанавливает успешную цепочку; следующий then возвращает Promise.resolve(1).
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Какой вывод появится в консоли при выполнении следующего кода?
Promise.resolve(1)
.then(x => x + 1)
.then(x => { throw x })
.then(x => console.log(x))
.catch(err => console.log(err))
.then(x => Promise.resolve(1))
.catch(err => console.log(err))
.then(x => console.log(x));
Ответ
Сначала выведется 2, затем 1. Первый catch обрабатывает брошенное значение 2 и восстанавливает успешную цепочку; следующий then возвращает Promise.resolve(1).
Первый then преобразует 1 в 2. Второй выбрасывает 2, поэтому обработчик console.log сразу после него пропускается. catch печатает ошибку 2 и сам возвращает undefined.
Следующий then игнорирует входное undefined и возвращает успешно завершённый Promise со значением 1. Второй catch не нужен и пропускается; последний then печатает 1. Выброшенное значение не обязательно является объектом Error, хотя в рабочем коде Error удобнее для диагностики.