Это зависит от ваших реальных целей.
Фактически, метод .then()
принимает два параметра:
- onFullfilled : обратный вызов будетвызывается, когда обещание выполнено.
- onRejected : обратный вызов, вызываемый при отклонении обещания.
На самом деле, .catch(fn)
- это просто сокращениедля .then(null, fn)
.
Оба .then()
и .catch()
каждый возвращают новое обещание, которое разрешает к своему возвращаемому значению.Другими словами:
- Разрешенное обещание этого значения, если оно не обещание.
- Фактическое возвращаемое значение, если это уже обещание (которое будет выполнено или отклонено).
- Отклоненное обещание, если возвращаемое значение является отклоненным обещанием (как сказано в предыдущем пункте) или выдается какая-либо ошибка.
Основная причина использования .then(onFullfill).catch(onReject)
шаблон вместо .then(onFullfill, onReject)
заключается в том, что в первом (что эквивалентно .then(onFullfill).then(null, onReject)
) мы приковываем обратный вызов onReject
к обещанию, возвращенному первым .then()
, а не непосредственно к исходному обещанию.
Следствием этого является то, что если в обратном вызове onFullfill
выдается ошибка en (или он возвращает обещание, которое оказывается преобразующимся в отклоненное состояние), оно будет также перехвачено цепочкой .catch()
.
Итак, отвечая на ваш вопрос, когда вы делаете что-то вроде:
P.then(...)
.then(...)
.then(...)
.catch(...)
;
Вы объединяете обещания, "предполагая, что" все будет хорошо "и только проверяйте в конце".То есть: всякий раз, когда какой-либо шаг заканчивается неудачей, все последующие .then()
обойдены до следующего (в данном случае последнего) .catch()
.
С другой стороны, если вы добавите больше .catch()
sв промежутке вы сможете перехватить отклоненные обещания раньше и, при необходимости, решить все происходящее и снова превратить его в разрешенное состояние, чтобы возобновить цепочку.