我想我已经了解了 Promise
、then
和 catch
以及嵌套 Promise,如 Are nested catches within promises required? 所示。 。但是,如果我正在嵌套 promise 并希望通过返回内部 promise 来避免内部catch
,那么我很难让以下内容不会因为Error
而崩溃code> 抛出在 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 向我展示了使用 yarn run start
启动的 yarn
开发服务器的 未处理的拒绝(错误):promise2 错误
。它指向promise2
中抛出的Error
。 Firefox 调试器跳转到我的代码之外的随机行并且不显示任何内容。
如果我在 promise2().then(...)
之后添加 catch
,Error
就会被捕获。
如何避免内部陷阱
?并从 promise2
捕获 Error
,例如在 catch
中
promise1()
.then(value => alert(value))
.catch(err => alert("err: "+err));
将每个函数体包装在 try-catch block 中并不是一种选择,因为内部 .catch(...)
已经更加优雅。
抛出Error
是一个最小的例子,当然,假设它是偶然发生的,并且promise2
返回的 promise 预计会做一些有用的事情并且具有错误。
我正在寻找一种允许更深层次嵌套的原则,例如使用 promise2
返回一个 promise3
,然后它可能会意外地抛出一个错误,就像 promise2
现在那样。
最佳答案
您的 promise2
已返回一个 Promise,因此无需再次显式构造 Promise。相反,只需链接 promise2
,如果它解析的值不正确,则抛出错误而不是调用 reject
。 (同样,不调用 resolve
,而是返回
您希望外部 Promise 解析为的表达式)
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));
关于javascript - 如果使用 then ,是否需要在 Promise 中嵌套 catch?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56103683/