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

问题描述 投票:3回答:2

当在JavaScript中处理承诺时,我们可以使用 .then, .catch.finally. 这些方法中的每一个都返回一个新的 Promise 对象。

使用 .then 是很直接的--我们把它们连锁起来。最后的用例--是把它放在链的最后。.then.catch. 但是...

在下面的代码中,根据我的理解,我们初始化了 promise 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"?
  })
javascript es6-promise
2个回答
3
投票

并非如此。当你有 p.then(handleThen).catch(handleCatch),如果 p 拒绝。handleCatch 会处理的。但是 handleCatch 处理 handleThen.

虽然这类错误在if handleThen 只包含同步代码,如果 handleThen 返回一个Promise。handleCatch 将能够处理该Promise,如果它拒绝。

<somePromiseChain>
  .catch(handleCatch);

将会有 handleCatch 处理上述 Promise 链中任何地方的错误。

与此相反,对于 p.then(resolutionHandler, rejectionHandler)జజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజ rejectionHandler只是 拒绝处理 p. 它将完全忽略任何发生在 resolutionHandler.

如果 resolutionHandler 是完全同步的,不返回Promise,也不抛出(这很常见),那么 .then(resolutionHandler, rejectionHandler) 确实等同于.then(resolutionHandler).catch(rejectionHandler). 但它是... 通常情况下 使用 .then(..).catch(..).

随着 p.then(success).catch(fail)జజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజ .catch 实际上是附加在由 .then - 但如果 p 驳回、 .then'的诺言也拒绝,价值相同。p的拒绝。这不是说 catch 直接连接到 p但它是连接到一个 .then 其中通过 p的拒绝通过。

每一个 .then .catch 直接连接到它所调用的上层Promise上,但有时上层Promise会通过从 上的诺言不改。即是。p.then(undefined, fail).then(success) 将运行 success 如果 p 解决了,中间的 .then 通过决议。随着拒绝。p.then(success).catch(fail) 将运行 fail 因为 .then(success) 传来传去 p 贯穿不改。


1
投票

呼叫 catch 内部称 reject

根据 mdn

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

© www.soinside.com 2019 - 2024. All rights reserved.