Promise 的第二个 .then() 没有失败 [英] Promise's second .then() not failing

查看:43
本文介绍了Promise 的第二个 .then() 没有失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在链接 .then() 对承诺的调用时遇到问题.执行以下代码时:

I'm having trouble with chaining .then() calls for a promise. When executing the following code:

var prom = new Promise(function(resolve, reject) {
  //let's always fail
  reject(Error("buuuu!"));
});

var thenable = 
prom.then(
    function(done) {
        console.log("First handler: Done!: Argument: ", done);
        return "First then: DONE";
    },
    function(fail) {
        console.error("First handler: Fail!. Argument: ", fail);
        return "First then: FAIL";
    }
).then(
    function(done) {
        console.info("Second handler: Done!.  Argument: ", done);
    },
    function(fail) {
        console.error("Second handler: Fail!.  Argument: ", fail);
    }
);

这将在控制台中打印以下内容:

This prints the following in the console:

First handler: Fail!. Argument:  Error {stack: (...), message: "buuuu!"}
Second handler: Done!.  Argument:  First then: FAIL


为什么第二个 then() 调用了它的 done 处理程序而不是 fail 一个?


Why does the second then() has its done handler called instead of the fail one?

这是 Chrome 的错误吗?(请注意,我只对 Chrome 浏览器的行为感兴趣)

Is this a bug with Chrome? (Note that I'm only interested in Google Chrome's behavior)

我是否需要从 .then 处理程序返回预先解析/拒绝的承诺?

Do I need to resort to returning pre-resolved/rejected Promises from the .then handlers?

推荐答案

为什么第二个 then() 调用的是其 done 处理程序而不是失败的处理程序?

Why does the second then() has its done handler called instead of the fail one?

因为您已经在链的第一个 then() 中处理了错误,所以使用您从返回的 "First then: FAIL" 字符串解析承诺

Because you handled the error in the first then() of the chain already, making the promise resolve with the "First then: FAIL" string that you returned from it.

这是 Chrome 的错误吗?

Is this a bug with Chrome?

不,这就是 Promise 的工作方式.

No, that's how promises are supposed to work.

我是否需要从 .then 处理程序返回预先解析/拒绝的承诺?

Do I need to resort to returning pre-resolved/rejected Promises from the .then handlers?

你可以这样做,是的.触发第二个失败处理程序的其他方法是:

You can do that, yes. Other ways to trigger the second fail handler would be:

  • 只需省略第一个错误处理程序:

  • Simply omit the first error handler:

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

  • 或者重新抛出异常(类似于返回被拒绝的承诺):

  • Or rethrow an exception (that's similar to returning a rejected promise):

    prom.then(function(done) {
        console.log("First handler: Done!: Argument: ", done);
        return "First then: DONE";
    }, function(fail) {
        console.error("First handler: Fail!. Argument: ", fail);
        throw new Error("First then: FAIL"); // or: throw fail;
        // alternatively, you can return a rejected promise:
        return Promise.reject(new Error("First then: FAIL"));
    }).then(function(done) {
        console.info("Second handler: Done!.  Argument: ", done);
    }, function(fail) {
        console.error("Second handler: Fail!.  Argument: ", fail);
    });
    

  • 这篇关于Promise 的第二个 .then() 没有失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆