Не совсем. Если у вас есть p.then(handleThen).catch(handleCatch)
, если p
отклоняет, handleCatch
будет обрабатывать его. Но handleCatch
будет также обрабатывать ошибки, выдаваемые handleThen
.
Хотя такие ошибки довольно необычны, если handleThen
содержит только синхронный код, если handleThen
возвращает Обещание, handleCatch
сможет обработать это Обещание, если оно отклонит его.
<somePromiseChain>
.catch(handleCatch);
будет иметь handleCatch
обработать любые ошибки, возникшие где-либо в вышеуказанной цепочке Обещания.
Для сравнения при p.then(resolutionHandler, rejectionHandler)
rejectionHandler
будет только обрабатывать отклонение p
. Он полностью игнорирует все, что происходит в resolutionHandler
.
Если resolutionHandler
является полностью синхронным, не возвращает Обещание и никогда не бросает (что довольно распространено), то .then(resolutionHandler, rejectionHandler)
действительно эквивалентно .then(resolutionHandler).catch(rejectionHandler)
. Но обычно неплохо использовать .then(..).catch(..)
.
С p.then(success).catch(fail)
, .catch
фактически присоединяется к Обещанию, возвращенному .then
- но если p
reject, обещание .then
также отклоняется, с тем же значением, что и отклонение p
. Дело не в том, что catch
присоединен непосредственно к p
, но он прикреплен к .then
, который проходит через отклонение p
.
Каждый .then
/ .catch
прикрепляется напрямую к верхнему обещанию он вызывается, но иногда это верхнее обещание проходит через значение от его верхнего обещания без изменений. Это. p.then(undefined, fail).then(success)
будет работать success
, если p
разрешится, с промежуточным .then
, пропустившим разрешение. При отклонении p.then(success).catch(fail)
будет работать fail
, потому что .then(success)
пропускает ошибку от p
до неизмененного.