【问题标题】: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 那样意外抛出错误。

【问题讨论】:

    标签: javascript typescript promise es6-promise


    【解决方案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));

    【讨论】:

      猜你喜欢
      • 2017-05-11
      • 1970-01-01
      • 2016-10-18
      • 2019-02-27
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多