Javascript 承诺';s second.then()没有失败
我在链接Javascript 承诺';s second.then()没有失败,javascript,google-chrome,promise,Javascript,Google Chrome,Promise,我在链接时遇到问题。然后()要求承诺。执行以下代码时: var prom=新承诺(函数(解析、拒绝){ //让我们永远失败吧 拒绝(错误(“buuuu!”); }); var thenable= 舞会,那么( 功能(完成){ log(“第一个处理程序:完成!:参数:”,完成); 返回“首先,然后:完成”; }, 功能(失败){ 错误(“第一个处理程序:失败!”。参数:,失败); 返回“先失败后失败”; } ).那么( 功能(完成){ console.info(“第二个处理程序:完成!”。参数:,
时遇到问题。然后()
要求承诺。执行以下代码时:
var prom=新承诺(函数(解析、拒绝){
//让我们永远失败吧
拒绝(错误(“buuuu!”);
});
var thenable=
舞会,那么(
功能(完成){
log(“第一个处理程序:完成!:参数:”,完成);
返回“首先,然后:完成”;
},
功能(失败){
错误(“第一个处理程序:失败!”。参数:,失败);
返回“先失败后失败”;
}
).那么(
功能(完成){
console.info(“第二个处理程序:完成!”。参数:,完成);
},
功能(失败){
错误(“第二个处理程序:失败!”。参数:,失败);
}
);
这将在控制台中打印以下内容:
First handler: Fail!. Argument: Error {stack: (...), message: "buuuu!"}
Second handler: Done!. Argument: First then: FAIL
为什么第二个
then()
调用了它的done
处理程序而不是fail
处理程序?
这是Chrome的bug吗?(注意,我只对谷歌浏览器的行为感兴趣)
我需要从处理程序返回预先解决/拒绝的承诺吗
为什么第二个then()调用了它的done处理程序而不是fail处理程序
因为您已经处理了链的第一个then()
中的错误,使承诺使用从中返回的“first-then:FAIL”
字符串进行解析
这是Chrome的bug吗
不,承诺就是这样起作用的
我是否需要从.then处理程序返回预先解决/拒绝的承诺
你能做到,是的。触发第二个失败处理程序的其他方法有:
- 只需省略第一个错误处理程序:
prom.then(function(done) {
console.log("First handler: Done!: Argument: ", done);
return "First then: DONE";
}).then(function(done) {
console.info("Second handler: Done!. Argument: ", done);
}, function(fail) {
console.error("Second handler: Fail!. Argument: ", fail);
});
- 或者重新抛出一个异常(类似于返回一个被拒绝的承诺):
为什么第二个then()调用了它的done处理程序而不是fail处理程序
让我们看看您的代码在同步世界中的外观:
var value;
try{
try {
throw new Error("buuu!");
console.log("First handler: Done!: Argument: ");
value = "First then: DONE";
} catch(e){
console.error("First handler: Fail!. Argument: ", e);
value = "First then: FAIL";
}
console.info("Second handler: Done!. Argument: ", value);
}catch(e){
console.error("Second handler: Fail!. Argument: ", e);
}
当您处理catch
子句中的错误时,就像处理then
子句中的错误一样,您可以从中恢复。promises示例与我们的同步示例完全相同
如果您希望发出信号,表明您执行了恢复逻辑,但链上仍处于拒绝状态,请重试。在同步代码中总是这样。或者在失败的情况下,您可以返回被拒绝的承诺。您的意思是返回prom
?是的,那可能也行,但有点奇怪。您可能已经立即将这两个处理程序连接到它:prom.then(donehandler1,failhandler1);然后(donehandler2,failhandler2)代码>谢谢!我有点假设“失败”的情况会在整个链中持续存在。而且,如果我没有弄错的话,直接在prom上调用两次会使两者同步执行,而不是链接。然后()。是的,对同一个承诺调用然后
两次会“分叉”执行流。不确定您需要什么,您需要发布真实世界的代码而不是示例。谢谢!你的答案也一样好,但另一个是第一个。我给了你一票,不管怎样,我也给了另一个答案一票:)我只是想给出与同步检查相比的透视图。+1。我想在我的回答中加入这个类比,但不知怎的,我知道@BenjaminGruenbaum不可避免的回答会走这条解释之路:——)
var value;
try{
try {
throw new Error("buuu!");
console.log("First handler: Done!: Argument: ");
value = "First then: DONE";
} catch(e){
console.error("First handler: Fail!. Argument: ", e);
value = "First then: FAIL";
}
console.info("Second handler: Done!. Argument: ", value);
}catch(e){
console.error("Second handler: Fail!. Argument: ", e);
}