我想我有了Promisethencatch的想法,以及Are nested catches within promises required?中所示的嵌套承诺。但是,如果我嵌套promise,并想通过返回内部promise来避免内部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浏览器显示了以Unhandled Rejection (Error): promise2 error开头的yarn开发服务器的yarn run start。它指向在Error中引发的promise2。 Firefox调试器跳到我的代码之外的任意行,并且不显示任何内容。

如果在catch之后添加promise2().then(...),则会捕获Error

如何避免内部catch?并从Error捕获promise2catch

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


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

当然,假定Error的抛出是一个最小的例子,并且假定promise2返回的promise会做一些有用的事情并且有一个错误。

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

最佳答案

您的promise2已经返回了Promise,因此无需再次显式构造Promise。相反,只需将promise2链接起来,如果解析的值不正确,则抛出错误而不是调用reject。 (类似地,您希望外部Promise解析为resolve而不是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));

07-26 08:09