Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 承诺';s second.then()没有失败_Javascript_Google Chrome_Promise - Fatal编程技术网

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);
}