如果在承诺中引发的错误(在父承诺中被称为错误),我们应该捕获错误还是将其自动捕获?
示例:
function p1(val)
{
return new Promise((resolve, reject) => {
//do something with val
if(val == true)
reject(err);
p2()
.then(result => resolve(result)
.catch(reject); //is this line necessary?
});
}
function p2()
{
return new Promise((resolve, reject) => {
//resolve or reject...
});
}
答案 0 :(得分:1)
使用修改后的代码,您可以在调用p2
之前进行工作,因此有一些选择。如果您对functino的初始,同步部分中的错误感到满意,而不是拒绝承诺,则可以这样做:
function p1(val) {
//do something with val
if (val == true)
throw err;
return p2();
}
第一部分同步发生,然后从p2
返回promise。是否执行此操作部分取决于函数的功能,而部分取决于样式。如果初始同步部分正在设置异步操作,并且您希望在设置异步过程遇到问题时抛出该函数(而不是返回被拒绝的诺言)(然后根据异步过程是否起作用来实现/拒绝) ),您可以这样做。
如果您希望函数始终通过承诺报告成功/失败,那么,如果您在进行初始工作,则确实需要自己的承诺:
function p1(val) {
return new Promise((resolve, reject) => {
//do something with val
if(val == true)
reject(err);
resolve(p2());
});
}
resolve(p2())
部分将创建的承诺p1
解析为p2
的承诺:如果p2
的承诺被拒绝,则p1
的承诺被拒绝。 p2
拒绝原因;如果p2
的诺言得以兑现,则p1
的诺言将以p2
兑现价值来实现。
或者您可以使用async
函数,其结果相同:
async function p1(val) {
//do something with val
if(val == true)
throw err;
return p2();
}
在两种情况下,即使初始代码不涉及异步处理,也可以确保初始代码在p2
之前抛出的任何错误均导致拒绝而不是同步错误。
要记住的主要事情是,当您已经有了一个承诺(例如来自p2
的承诺)时,就无需使用new Promise
;相反,只是束缚您已经拥有的诺言。 ({More here。)但是,当您在之前做某事时,您会得到应有的承诺,就像在修改后的示例中一样,您可能会根据是否想要函数的第一部分来创建自己的承诺。同步错误或承诺拒绝。