我想我有了Promise
,then
和catch
的想法,以及Are nested catches within promises required?中所示的嵌套承诺。但是,如果我嵌套promise,并想通过返回内部promise来避免内部catch
,那么由于Error
中抛出了promise2
,我将很难使以下内容不崩溃:
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浏览器显示了以
Unhandled Rejection (Error): promise2 error
开头的yarn
开发服务器的yarn run start
。它指向在Error
中引发的promise2
。 Firefox调试器跳到我的代码之外的任意行,并且不显示任何内容。如果在
catch
之后添加promise2().then(...)
,则会捕获Error
。如何避免内部
catch
?并从Error
捕获promise2
在catch
中promise1()
.then(value => alert(value))
.catch(err => alert("err: "+err));
将每个函数体包装在try-catch块中不是一个选择,因为内部
.catch(...)
已经很优雅了。当然,假定
Error
的抛出是一个最小的例子,并且假定promise2
返回的promise会做一些有用的事情并且有一个错误。我正在寻找一种允许更深层嵌套的原理,例如与
promise2
一起返回promise3
然后意外地可能会像现在promise2
一样引发错误。 最佳答案
您的promise2
已经返回了Promise,因此无需再次显式构造Promise。相反,只需将promise2
链接起来,如果解析的值不正确,则抛出错误而不是调用reject
。 (类似地,您希望外部Promise解析为resolve
而不是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));