我想我有了Promise
,then
和catch
的想法,以及Are nested catches within promises required?中所示的嵌套承诺。但是,如果我嵌套承诺并想通过返回内部承诺来避免内部catch
,那么由于Error
中抛出了{{ 1}}:
promise2
Chrome浏览器显示了function promise1(): Promise<string> {
return new Promise(function(resolve, reject) {
return promise2().then(promise2Result => {
if(promise2Result !== "") {
resolve("The value is "+promise2Result);
}else {
reject(new Error("promise2.then error"));
}
})
});
}
function promise2(): Promise<string> {
return new Promise(function(resolve, reject) {
throw new Error("promise2 error");
});
}
开发服务器中Unhandled Rejection (Error): promise2 error
中以yarn
开头的yarn run start
。它指向Error
中引发的promise2
。 Firefox调试器跳到我的代码之外的任意行,并且什么也不显示。
如果我在catch
之后添加promise2().then(...)
,则会发现Error
。
如何避免使用内部catch
?并从Error
中捕获promise2
,例如在{p}中的catch
中
promise1()
.then(value => alert(value))
.catch(err => alert("err: "+err));
在try-catch块中包装每个函数体都不是一种选择,因为内部.catch(...)
已经很优雅了。
抛出Error
只是一个最小的例子,当然,假设它是偶然发生的,并且promise2
返回的诺言有望做些有用的事情并且有一个错误。
我正在寻找一种允许更深层嵌套的原理,例如promise2
返回一个promise3
,然后意外地可能会像现在promise2
一样抛出错误。
答案 0 :(得分:3)
您的promise2
已经返回了Promise,因此无需再次显式构造Promise 。相反,只需断开promise2
的链接,如果解析的值不正确,则抛出错误而不是调用reject
。 (类似,resolve
不是您希望外部Promise解析为的表达式,而是调用return
)
function promise1() {
return promise2().then(promise2Result => {
if (promise2Result !== "") {
return "The value is " + promise2Result;
} else {
throw new Error("promise2.then error");
}
})
}
function promise2() {
return new Promise(function(resolve, reject) {
throw new Error("promise2 error");
});
}
promise1()
.catch(e => console.log(e.message));