如果使用了承诺,是否需要在承诺内进行嵌套捕获?

时间:2019-05-12 21:39:51

标签: javascript typescript promise es6-promise

我想我有了Promisethencatch的想法,以及Are nested catches within promises required?中所示的嵌套承诺。但是,如果我嵌套承诺并想通过返回内部承诺来避免内部catch,那么由于Error中抛出了{{ 1}}:

promise2

Chrome浏览器显示了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"); }); } 开发服务器中Unhandled Rejection (Error): promise2 error中以yarn开头的yarn run start。它指向Error中引发的promise2。 Firefox调试器跳到我的代码之外的任意行,并且什么也不显示。

如果我在catch之后添加promise2().then(...),则会发现Error

如何避免使用内部catch?并从Error中捕获promise2,例如在{p}中的catch

promise1()
  .then(value => alert(value))
  .catch(err => alert("err: "+err));

在try-catch块中包装每个函数体都不是一种选择,因为内部.catch(...)已经很优雅了。

抛出Error只是一个最小的例子,当然,假设它是偶然发生的,并且promise2返回的诺言有望做些有用的事情并且有一个错误。

我正在寻找一种允许更深层嵌套的原理,例如promise2返回一个promise3,然后意外地可能会像现在promise2一样抛出错误。

1 个答案:

答案 0 :(得分:3)

您的promise2已经返回了Promise,因此无需再次显式构造Promise 。相反,只需断开promise2的链接,如果解析的值不正确,则抛出错误而不是调用reject。 (类似,resolve不是您希望外部Promise解析为的表达式,而是调用return

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));