`.then` 和 `.catch` Promise 处理程序是否以某种方式配对并像 `.then(resolutionHandler, rejectionHandler)` 一样对待?

Are `.then` and `.catch` Promise handlers somehow paired and treated like `.then(resolutionHandler, rejectionHandler)`?

在 JavaScript 中使用 promises 时,我们可以使用 .then.catch.finally。这些方法中的每一个 returns 一个新的 Promise 对象。

使用 .then 非常简单 - 我们将它们链接起来。 finally - 的用例是将它放在 .then.catch 链的末尾。但是

在下面的代码中,据我了解,我们初始化了可以解析或拒绝的承诺 p。我可以使用 .then(resolutionHandler, rejectionHandler),这是不言自明的,因为它只有 1 .then "handler" 与两个处理程序,但在顺序 .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"?
  })

调用catch内部调用reject

根据mdn

catch() 方法 returns 一个 Promise,只处理被拒绝的情况。它的行为与调用 Promise.prototype.then(undefined, onRejected) 相同(事实上,调用 obj.catch(onRejected) 内部调用 obj.then(undefined, onRejected))。

不完全是。当你有 p.then(handleThen).catch(handleCatch) 时,如果 p 拒绝,handleCatch 将处理它。但是 handleCatch 也会 处理 handleThen.

抛出的错误

尽管如果 handleThen 仅包含同步代码,此类错误很不常见,但如果 handleThen return 是 Promise,handleCatch 将能够处理该错误如果拒绝就答应。

<somePromiseChain>
  .catch(handleCatch);

将让 handleCatch 处理上述 Promise 链中任何地方抛出的任何错误。

相比之下,对于 p.then(resolutionHandler, rejectionHandler)rejectionHandler 处理 p 的拒绝。它将完全忽略 resolutionHandler.

中发生的任何事情

如果 resolutionHandler 是完全同步的,return 不是一个 Promise,并且从不抛出(这很常见),那么 .then(resolutionHandler, rejectionHandler) 确实等同于 .then(resolutionHandler).catch(rejectionHandler).但是usually a good idea使用.then(..).catch(..).

使用 p.then(success).catch(fail).catch 实际上附加到 .then 编辑的 Promise return - 但如果 p 拒绝,.then 的 Promise 也被拒绝,其值与 p 的拒绝相同。并不是 catch 直接附加到 p,而是附加到 .then,后者通过 p 的拒绝。

每个 .then / .catch 都直接附加到它调用的上层 Promise,但有时上层 Promise 会传递来自 its upper 的值承诺不变。那是。 p.then(undefined, fail).then(success) 将 运行 success 如果 p 解决,中间 .then 通过解决。拒绝后,p.then(success).catch(fail) 将 运行 fail 因为 .then(success) 通过未更改的 p 传递失败。