【发布时间】:2019-09-29 21:39:51
【问题描述】:
我想我知道了Promise、then 和catch 以及嵌套承诺,如Are nested catches within promises required? 所示。但是,如果我嵌套承诺并希望通过返回内部承诺来避免内部catchs,那么由于promise2 中抛出的Error,我很难让以下内容不崩溃:
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");
});
}
Chrome 向我展示了以 yarn run start 开头的 yarn 开发服务器的 Unhandled Rejection (Error): promise2 error。它指向promise2 中抛出的Error。 Firefox 调试器跳转到我的代码之外的随机行并且什么也不显示。
如果我在promise2().then(...) 之后添加catch,则会捕获Error。
如何避免内部catch?并从promise2 中捕获Error,例如在catch 中
promise1()
.then(value => alert(value))
.catch(err => alert("err: "+err));
将每个函数体包装在 try-catch 块中并不是一种选择,因为内部 .catch(...) 已经更优雅了。
Error 的抛出只是一个最小的例子,当然,假设它是偶然发生的,并且 promise2 返回的承诺预期会做一些有用的事情并且有一个错误。
我正在寻找一种允许更深嵌套的原则,例如使用 promise2 返回 promise3 ,然后可能会像现在 promise2 那样意外抛出错误。
【问题讨论】:
标签: javascript typescript promise es6-promise