`.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
传递失败。
在 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
传递失败。