当在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"?
})
并非如此。当你有 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
贯穿不改。
呼叫 catch
内部称 reject
根据 mdn
catch()方法返回一个Promise,并且只处理被拒绝的情况。它的行为与调用Promise.prototype.then(undefined, onRejected)相同(事实上,调用ob.catch(onRejected)会在内部调用ob.then(undefined, onRejected))。