如果使用 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 【问题描述】:

我想我知道了Promisethencatch 以及嵌套承诺,如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 那样意外抛出错误。

【问题讨论】:

【参考方案1】:

你的promise2 已经返回了一个Promise,所以不需要再次显式构造一个Promise。相反,只需链接promise2,如果它解析的值不正确,则抛出错误而不是调用reject。 (同样,不要调用resolvereturn 你希望外部 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 执行上下文

js的promise如何递归调用?

为啥 Promise 构造函数需要一个在完成时调用 'resolve' 的函数,但 'then' 不需要 - 它返回一个值?

javascript,promise,如何在 then 范围内访问变量 this [重复]