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

Javascript “.then”和“.catch”承诺处理程序是否以某种方式配对并像“.then(resolutionHandler,rejectionHandler)”一样处理?,javascript,es6-promise,Javascript,Es6 Promise,在JavaScript中处理承诺时,我们可以使用。然后,。catch和。最后。每个方法都返回一个新的Promise对象 使用。那么就相当简单了——我们将它们链接起来。finally-的用例是将它放在链的末尾,然后和和{ 拒绝(“ups…”); }); P 。然后(数据=>{ //这是Promise“p”的成功处理程序 }) .catch(错误=>{ //这是承诺“p”的失败处理程序吗? }) 呼叫捕获内部呼叫拒绝 依照 catch()方法返回一个承诺,只处理被拒绝的情况。它的行为与调用Promi

在JavaScript中处理承诺时,我们可以使用
。然后
。catch
。最后
。每个方法都返回一个新的
Promise
对象

使用
。那么
就相当简单了——我们将它们链接起来。finally-的用例是将它放在
链的末尾,然后
。但是

据我所知,在下面的代码中,我们初始化promise
p
,它可以解析或拒绝。我可以使用
.then(resolutionHandler,rejectionHandler)
,这是不言自明的,因为它只有1个
。然后
“handler”与两个处理程序一起使用,但在排序的情况下
。然后
。catch
而不是后一种方法-

**是
.then
.catch
处理程序以某种方式配对并像
一样处理。然后(resolutionHandler,rejectionHandler)
?还是发生了什么事**

const p=新承诺((解决、拒绝)=>{
拒绝(“ups…”);
});
P
。然后(数据=>{
//这是Promise“p”的成功处理程序
})
.catch(错误=>{
//这是承诺“p”的失败处理程序吗?
})

呼叫
捕获
内部呼叫
拒绝

依照


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

不完全相同。当您有
p.then(handleThen).catch(handleCatch)
时,如果
p
拒绝,则
handleCatch
将处理它。但是
handleCatch
也会处理
handleThen
抛出的错误

尽管这些类型的错误在if
handleThen
只包含同步代码时非常罕见,但如果
handleThen
返回承诺,则如果拒绝承诺,
handleCatch
将能够处理该承诺

<somePromiseChain>
  .catch(handleCatch);

.接住(把手接住);
将让
handleCatch
处理上述承诺链中任何地方抛出的任何错误

相反,使用
p.then(resolutionHandler,rejectionHandler)
rejectionHandler
处理
p
的拒绝。它将完全忽略
resolutionHandler
中发生的任何内容

如果
resolutionHandler
是完全同步的,不返回承诺,并且从不抛出(这是很常见的),那么
.then(resolutionHandler,rejectionHandler)
实际上相当于
.then(resolutionHandler).catch(rejectionHandler)
。但它是使用
。然后(…)。捕获(…)

使用
p.then(success).catch(fail)
.catch
实际上附加到
返回的承诺上。然后
-但是如果
p
拒绝,那么
的承诺也会拒绝,其值与
p
的拒绝相同。并不是说
捕获
直接附加到
p
,而是附加到一个
。然后
通过
p
的拒绝


每个
.then
/
.catch
都直接附加到调用它的上承诺,但有时该上承诺会通过其上承诺的值进行传递,而不会改变。就是
p.then(未定义,失败)。然后(success)
将运行
success
如果
p
解析,中间
。然后
通过解析。在拒绝时,
p.then(success).catch(fail)
将运行
fail
,因为
.then(success)
会将失败从
p
传递到未更改的状态。

因此这是两种完全不同的机制,JS运行时不会将它们解析为相同的代码。我可能会怀疑在case
p.then.catch中,如果
p
get被拒绝,那么首先
。然后将测试
是否有
rejectionHandler
,它不在
中。然后。catch
案例,因此拒绝会传播到下一个处理程序(基本上承诺返回值为first。
然后在本例中拒绝
),无论这是
,然后是
.catch
。最后是
…这是对的吗?如果是,这在JS文档中是写在哪里的?是的,如果有
p。然后(成功,失败)
fail
将处理
p
产生的错误,无论整个
之后发生什么。然后
。使用
p.then(success,fail)
,无论是
success
还是
fail
都将被输入。但是
。然后(success)
只有在解决了上面的承诺后才会运行,并且
.catch(fail)
仅在上限承诺被拒绝时运行。您可以看到其上的规范,但它非常密集。另一种方式是:
。catch(fail)
执行与
相同的操作。然后(未定义,fail)
。如果上承诺被拒绝,则输入
失败
,否则已履行的承诺将原封不动地通过。类似地,
。如果上承诺被拒绝,则传递(成功)
。使用
p.then(成功)。捕获(失败)
.catch
实际上附加在
返回的承诺上。然后
——但是如果
p
拒绝,那么
的承诺也会拒绝,其值与
p
的拒绝值相同。
catch
不是直接附加到
p
,而是附加到
通过
p
的拒绝。