让p成为我们可以做的承诺
p
.then(f1)
.then(f2)
.then(f3)
.catch(f4)
现在处于catch状态,可以从f1,f2,f3或者p中的任何一个中抛出错误
现在应该是处理f4(或catch中)错误的正确方法,因为上面抛出的错误可能是不同的类型,如果在f4中可以避免多个 ?
答案 0 :(得分:2)
您可以定义自己的自定义错误。例如:
function CustomError(errorText){
this.error = errorText;
}
修改你的功能。为函数返回的每个Promise添加catch块:
function p(){
return new Promise(function(resolve, reject){
//Your functionality here
})
.catch(function(error){
Promise.reject(new CustomError('f1')));
})
}
依此类推:f2,f3,f4
你的捕获区将是:
.catch((err) => {
if(err instanceof CustomError){
HandleCustomError(err);
} else {
//Some another error is happen
}
})
你自定义错误处理程序将是这样的:
function HandleCustomError(customError){
switch(customError.error){
case 'f1':
//handle f1
break;
case 'f2':
//handle f2
break;
...
}
}
答案 1 :(得分:0)
只需定义一个额外的catch
回调:
p
.then(f1)
.then(f2)
.then(f3)
.catch(err => {
if (/* is expected error */) {
console.log(err);
return;
}
throw new Error('Unexpected error');
})
.catch(err => ...)
答案 2 :(得分:0)
通过在被拒绝的Promise中捕获错误,您不必担心最终catch块中的错误类型不同,并且您的代码应更具可读性(从某种意义上来说,更容易看到每个catch块可以处理适当的拒绝)。
如果您有可能,我还建议您使用async / await。 在此语法中,被拒绝的承诺等同于抛出的错误。 而不是使用大量链接的Promises,“将每个catch块放置在正确的位置”的逻辑更加直接,并且应该使错误更容易被发现。
YEAR MONTH amount
2017 6 296.00
2017 7 0
2017 8 0
2017 9 0
2017 10 0
2017 11 0
2017 12 0
2018 1 131.00
2018 2 154.00
2018 3 441.00
etc.