Javascript承诺链接多个错误

Javascript承诺链接多个错误,javascript,chaining,Javascript,Chaining,为什么我所有已解决的回调都被正确执行了,但只是 正在运行1错误回调 在这里的示例中,如果longOperation(true)我只得到一个错误,而当使用false运行时,我得到两个已解析的消息。据我所知,每个。然后返回第二个处于错误状态的新承诺。然后错误回调注册 这个例子是用Typescript编写的 函数长操作(错误){ 返回新承诺((解决、拒绝)=>{ 如果(错误){ 拒绝(“错误”) }否则{ setTimeout(函数(){ 解析(真) }, 1000) } }) } 设op=long

为什么我所有已解决的回调都被正确执行了,但只是 正在运行1错误回调

在这里的示例中,如果
longOperation(true)
我只得到一个错误,而当使用false运行时,我得到两个已解析的消息。据我所知,每个
。然后
返回第二个
处于错误状态的新承诺。然后
错误回调注册

这个例子是用Typescript编写的

函数长操作(错误){
返回新承诺((解决、拒绝)=>{
如果(错误){
拒绝(“错误”)
}否则{
setTimeout(函数(){
解析(真)
}, 1000)
}
})
}
设op=longOperation(真);
op
。然后(结果=>{
console.log(“已解决1”)
},未定义)
。然后(结果=>{
console.log(“已解决2”)
},未定义)
.然后(未定义,错误=>{
控制台日志(“错误1”)
})
.然后(未定义,错误=>{
控制台日志(“错误2”)

})
第一个错误处理程序捕获错误,就像常规的
捕获
块一样。如果希望拒绝链接承诺,则必须重新显示错误:

Promise.reject()。然后(()=>{
控制台日志(1);
}).然后(()=>{
控制台日志(2);
})。然后(null,e=>{
控制台日志(3);
抛出e;//{
控制台日志(4);

});
第一个错误处理程序捕捉到错误,就像常规的
捕捉
块一样。如果希望拒绝链接承诺,则必须重新显示错误:

Promise.reject()。然后(()=>{
控制台日志(1);
}).然后(()=>{
控制台日志(2);
})。然后(null,e=>{
控制台日志(3);
抛出e;//{
控制台日志(4);
});
承诺可以“恢复”

错误将沿着“.then”s链向下传播,直到找到错误回调。当它找到错误回调时,将执行错误回调,并将返回值向下传递给下一个promise的resolve方法

因此,只有距离承诺最近的错误回调才会执行

如果您想捕获链中所有可能的错误,只需将错误回调放在链的末尾,所有错误都将由它处理

在您的代码示例中,您实际上创建了5个承诺。原始承诺和“.then”各1个。第二个和第三个承诺只有一个onResolved方法,最后两个承诺只有一个have和onRejected方法

这就是它的执行方式:

第一个承诺(op):我刚刚拒绝了。我看到我有一个延迟承诺,没有onRejected回调。所以我将用我拒绝的值调用它的reject方法

第二个承诺:前面的承诺调用了我的拒绝方法,我还有一个延迟承诺,没有onRejected回调。因此,我将使用与我拒绝的值相同的值调用它的拒绝方法

第三个承诺:前面的承诺调用了我的拒绝方法。我也有一个延迟承诺,但我的承诺有一个onRejected回调。我将使用我拒绝的值调用回调,并使用回调的返回值调用我的延迟承诺的resolve方法

第四个承诺:前一个承诺调用了我的resolve方法。我有一个延迟承诺,但它没有onResolved回调,所以我将使用我解析的值调用它的resolved方法

第五个承诺:之前的承诺称为我的解决方法。我解决了问题,因为我没有延迟承诺。承诺可以“恢复”

错误将沿着“.then”s链向下传播,直到找到错误回调。当它找到错误回调时,将执行错误回调,并将返回值向下传递给下一个promise的resolve方法

因此,只有距离承诺最近的错误回调才会执行

如果您想捕获链中所有可能的错误,只需将错误回调放在链的末尾,所有错误都将由它处理

在您的代码示例中,您实际上创建了5个承诺。原始承诺和“.then”各1个。第二个和第三个承诺只有一个onResolved方法,最后两个承诺只有一个have和onRejected方法

这就是它的执行方式:

第一个承诺(op):我刚刚拒绝了。我看到我有一个延迟承诺,没有onRejected回调。所以我将用我拒绝的值调用它的reject方法

第二个承诺:前面的承诺调用了我的拒绝方法,我还有一个延迟承诺,没有onRejected回调。因此,我将使用与我拒绝的值相同的值调用它的拒绝方法

第三个承诺:前面的承诺调用了我的拒绝方法。我也有一个延迟承诺,但我的承诺有一个onRejected回调。我将使用我拒绝的值调用回调,并使用回调的返回值调用我的延迟承诺的resolve方法

第四个承诺:前一个承诺调用了我的resolve方法。我有一个延迟承诺,但它没有onResolved回调,所以我将使用我解析的值调用它的resolved方法


第五个承诺:之前的承诺称为我的解决方法。我解决了问题,因为我没有延迟承诺。你是不是碰巧使用了TypeScript或Flow?因为
Promise
本身不是有效的JavaScript,所以你的例子不会像现在这样运行。我不完全理解这个例子,但有几件事可能这里是
Promise.prototype.then的方法(oncompleted,onRejected)
。第一个参数是成功回调,而第二个参数是失败/拒绝回调。您只是不断地将
链接在一起。然后
使用成功回调,但没有错误回调。此外,您还可以选择使用
Promise.prototype.catch(onRejected)
而不是将第二个错误回调传递给
。然后
确实是,键入script.Edited post correly,错误处理函数将在出现错误时调用。因此,如果在第一个错误处理函数中没有调用错误,