Являются ли обработчики Promise `.then` и` .catch` парными и обрабатываются ли как `.then (resolutionHandler, rejectionHandler)`? - PullRequest
4 голосов
/ 28 апреля 2020

При работе с обещаниями в JavaScript у нас есть возможность использовать .then, .catch и .finally. Каждый из этих методов возвращает новый Promise объект.

Использование .then довольно просто - мы их цепочечно. Вариант использования для finally - это поместить его в конец цепочки .then и .catch. Но

В приведенном ниже коде, как я понимаю, мы инициализируем обещание p, которое можно разрешить или отклонить. Я мог бы использовать .then(resolutionHandler, rejectionHandler), что самоочевидно, поскольку это всего лишь 1 .then «обработчик» с обоими обработчиками, но в случае последовательности .then и .catch вместо последнего подхода -

** Обработчики .then и .catch как-то спарены и рассматриваются как .then(resolutionHandler, rejectionHandler)? или что-то еще происходит? **

const p = new Promise((resolve, reject) => {
  reject("ups...");
});

p
  .then(data => {
    // this is success handler for Promise "p"
  })
  .catch(err => {
    // Is this failure handler for Promise "p"?
  })

Ответы [ 2 ]

3 голосов
/ 28 апреля 2020

Не совсем. Если у вас есть 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 до неизмененного.

1 голос
/ 28 апреля 2020

Вызов catch внутренних вызовов reject

Согласно mdn

Метод catch () возвращает Promise и обрабатывает только отклоненные случаи , Он ведет себя так же, как и вызов Promise.prototype.then (undefined, onRejected) (фактически, внутренний вызов obj.catch (onRejected) вызывает obj.then (undefined, onRejected)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...