Javascript “.then”和“.catch”承诺处理程序是否以某种方式配对并像“.then(resolutionHandler,rejectionHandler)”一样处理?
在JavaScript中处理承诺时,我们可以使用Javascript “.then”和“.catch”承诺处理程序是否以某种方式配对并像“.then(resolutionHandler,rejectionHandler)”一样处理?,javascript,es6-promise,Javascript,Es6 Promise,在JavaScript中处理承诺时,我们可以使用。然后,。catch和。最后。每个方法都返回一个新的Promise对象 使用。那么就相当简单了——我们将它们链接起来。finally-的用例是将它放在链的末尾,然后和和{ 拒绝(“ups…”); }); P 。然后(数据=>{ //这是Promise“p”的成功处理程序 }) .catch(错误=>{ //这是承诺“p”的失败处理程序吗? }) 呼叫捕获内部呼叫拒绝 依照 catch()方法返回一个承诺,只处理被拒绝的情况。它的行为与调用Promi
。然后
,。catch
和。最后
。每个方法都返回一个新的Promise
对象
使用。那么
就相当简单了——我们将它们链接起来。finally-的用例是将它放在链的末尾,然后
和和
。但是
据我所知,在下面的代码中,我们初始化promisep
,它可以解析或拒绝。我可以使用.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
抛出的错误
尽管这些类型的错误在ifhandleThen
只包含同步代码时非常罕见,但如果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运行时不会将它们解析为相同的代码。我可能会怀疑在casep.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
的拒绝。