如果使用 then,是否需要承诺中的嵌套捕获?

Are nested catches within promises required if then is used?

我想我明白了 Promisethencatch 以及 中所示的嵌套承诺。但是,如果我正在嵌套承诺并希望通过返回内部承诺来避免内部 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 向我显示 yarn 开发服务器的 Unhandled Rejection (Error): promise2 erroryarn run start 启动。它指向 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 返回的 promise 应该做一些有用的事情并且有一个错误。

我正在寻找允许更深嵌套的原则,例如promise2 其中 returns 一个 promise3 然后可能会意外地抛出一个错误,就像 promise2 现在所做的那样。

您的 promise2 已经 returns 一个 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));