承诺的第二。然后()不失败 [英] Promise's second .then() not failing
问题描述
在链接 .then()
调用一个承诺时遇到问题。在执行以下代码时:
var prom = new Promise(function(resolve,reject){
//让我们总是失败
reject(Error(buuu!!));
});
$ b var thenable =
prom.then(
function(done){
console.log(First handler:Done !: Argument:,done);
returnFirst then:DONE;
},
function(fail){
console.error(First handler:Fail !. Argument:,fail);
returnFirst then:FAIL;
}
).then(
function(done){
console.info(Second handler:Done !. Argument: ,done);
},
function(fail){
console.error(Second handler:Fail !. Argument:,fail);
}
);
这将在控制台中显示以下内容:
第一个处理程序:失败!参数:错误{stack:(...),message:buuuu!}
第二句柄:完成!参数:首先:失败
为什么第二个 then()
已调用 done
处理程序而不是失败
一个?
这是Chrome的错误吗? (请注意,我只对Google Chrome的行为感兴趣)
我是否需要求助于返回预先解析/拒绝的Promise .then
处理程序?
第二个then()的完成处理程序调用而不是失败吗?
因为您在第一个 then()
,从而使承诺能够解决您从它返回的First then:FAIL
字符串。
这是Chrome的错误吗?
我是否需要求助于返回预先解析/拒绝的Promise .then处理程序?
您可以这样做,是的。触发第二个失败处理程序的其他方法是: 简单地省略第一个错误处理程序: 或重新抛出一个异常(类似于返回被拒绝的promise):
prom.then(function(done){
console.log(First handler:Done !: Argument:,done);
returnFirst then:DONE;
))。then(function(done){
console.info(Second handler:Done !. Argument:,done);
},function(fail){
console.error(Second handler:Fail !. Argument:,fail);
});
$ b $
prom.then(function(done){
console.log(First handler:Done !: Argument:,done) ;
returnFirst then:DONE;
},function(fail){
console.error(First handler:Fail !. Argument:,fail);
抛出new Error(First then:FAIL); //或:throw fail;
//或者,您可以返回一个被拒绝的promise:
return Promise.reject(new Error(First then: FAIL));
})。then(function(done){
console.info(Second handler:Done !. Argument:,done);
},function ){
console.error(Second handler:Fail !. Argument:,fail);
});
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
Why does the second then()
has its done
handler called instead of the fail
one?
Is this a bug with Chrome? (Note that I'm only interested in Google Chrome's behavior)
Do I need to resort to returning pre-resolved/rejected Promises from the .then
handlers?
Why does the second then() has its done handler called instead of the fail one?
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.
Is this a bug with Chrome?
No, that's how promises are supposed to work.
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); });
这篇关于承诺的第二。然后()不失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!