如果使用 then ,是不是需要在 promise 中嵌套 catch?
Posted
技术标签:
【中文标题】如果使用 then ,是不是需要在 promise 中嵌套 catch?【英文标题】:Are nested catches within promises required if then is used?如果使用 then ,是否需要在 promise 中嵌套 catch? 【发布时间】:2019-09-29 21:39:51 【问题描述】:我想我知道了Promise
、then
和catch
以及嵌套承诺,如Are nested catches within promises required? 所示。但是,如果我嵌套承诺并希望通过返回内部承诺来避免内部catch
s,那么由于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
那样意外抛出错误。
【问题讨论】:
【参考方案1】:你的promise2
已经返回了一个Promise,所以不需要再次显式构造一个Promise。相反,只需链接promise2
,如果它解析的值不正确,则抛出错误而不是调用reject
。 (同样,不要调用resolve
,return
你希望外部 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));
【讨论】:
以上是关于如果使用 then ,是不是需要在 promise 中嵌套 catch?的主要内容,如果未能解决你的问题,请参考以下文章
angular 1 promise call http 有效,但不适用于来自 json 结构的假数据,promise.then 不是函数
为啥在 React 组件中调用了两次 Promise.then 而不是 console.log?
使用类方法作为回调时的 Promise.then 执行上下文
为啥 Promise 构造函数需要一个在完成时调用 'resolve' 的函数,但 'then' 不需要 - 它返回一个值?