我有一连串的承诺
promisedStep1()
.then(promisedStep2)
.then(promisedStep3)
.then(promisedStep4)
.then(function (value4) {
// Do something with value4
})
.catch(function (error) {
// Handle any error from all above steps
});
我需要知道哪一步出错了。
如果我在每个承诺的步骤中添加catch
promisedStep1()
.catch(function(){
throw {code: 1}
})
.then(promisedStep2)
.catch(function(){
throw {code: 2}
})
.catch(function (error) {
console.log('error in ', error.code);
});
code
总是2,因为它从第一次捕获到第二次捕获。
处理此类错误的技巧是什么?
修改
找到方法:
function promisedStep1Wrapper(){
return promisedStep1()
.catch(function(){
throw {code: 1};
});
}
function promisedStep2Wrapper(){
return promisedStep2()
.catch(function(){
throw {code: 2};
});
}
promisedStep1Wrapper()
.then(promisedStep2Wrapper)
.catch(function(err){
console.log(err.code);
});
这没关系,还是有更好的解决方案?
答案 0 :(得分:1)
这可以吗?
是的,完全。
还是有更好的解决方案吗?
“更好”我不知道,但还有其他人肯定。一种方法是仅处理您期望的错误 - 上一步中的错误,并重新抛出其他所有错误。像Bluebird这样的一些库确实有专门的辅助功能,这种方法非常出色。基本上看起来像这样:
promisedStep1() // throws Step1Error
.catch(function(err) {
if (!(err instanceof Step1Error)) throw err;
throw {code: 1};
})
.then(promisedStep2) // throws Step2Error
.catch(function(err) {
if (!(err instanceof Step2Error)) throw err;
throw {code: 2};
})
.catch(function(error) {
if (!("code" in error)) throw error; // duck typing
console.log('error in ', error.code);
})
.catch(function(error) {
console.error("completely unexpected:", error);
});
另一种方法是嵌套并使用第二个then
回调进行专门的错误处理 - 请参阅When is .then(success, fail) considered an antipattern for promises?以了解与.then().catch()
的差异。使用它,您的代码看起来像
promisedStep1()
.then(function(res) {
return promisedStep2(res)
.then(function(res) {
// do something
return res;
}, function(err) { // error in promisedStep2
throw {code: 2};
});
}, function(err) { // error in promisedStep1
throw {code: 1};
})
.catch(function(error) {
if ("code" in error)
console.log('error in ', error.code);
else
console.error("completely unexpected:", error); // from "do something"
});
这种方法运行良好,允许对附加哪些处理程序进行细粒度控制,干净地分离成功和错误路径,但在语法上有点混乱。