Как работает цепочка Promise.then.catch.then.catch.then в JavaScript и когда выполняется последний then
Что проверяют
Понимаете ли вы, что каждый then и catch возвращают новый промис, и знаете ли, что происходит после перехвата ошибки.
Как отвечать
Ключевая мысль: цепочка это последовательность промисов, а не один. Каждый then и catch возвращает новый промис, и следующее звено работает уже с ним.
Правила прохода:
thenпропускается, если промис отклонён: управление ищет ближайшийcatchниже;catchперехватывает отклонение и, если внутри не бросить исключение заново, возвращает исполненный промис. Значит цепочка продолжается в нормальном режиме, и следующийthenвыполнится;- возврат значения из обработчика становится значением следующего промиса, а возврат промиса разворачивается: следующее звено ждёт его.
fetchUser()
.then(u => u.id) // выполнится при успехе
.catch(() => null) // поймает ошибку и вернёт null
.then(id => load(id)) // выполнится в любом случае: после успеха или после catch
.catch(showError)
.then(hideSpinner); // выполнится всегдаОтсюда прямой ответ на вопрос: последний then выполнится в обоих случаях, потому что перед ним стоит catch, который «гасит» ошибку и переводит цепочку обратно в успешное состояние. Не выполнится он только если сам catch бросит исключение или вернёт отклонённый промис.
Полезно добавить, что для действия «в любом исходе» лучше подходит finally: он не меняет значение и не глушит ошибку.
Где спотыкаются
Считают, что после catch цепочка обрывается.
Забывают вернуть значение из then и получают undefined дальше.
Ставят один catch в начале цепочки и не ловят ошибки последующих звеньев.
Используют catch там, где нужен finally, и незаметно проглатывают ошибку.