javascript - 如果使用 then ,是否需要在 Promise 中嵌套 catch?

标签 javascript typescript promise es6-promise

我想我已经了解了 Promisethencatch 以及嵌套 Promise,如 Are nested catches within promises required? 所示。 。但是,如果我正在嵌套 promise 并希望通过返回内部 promise 来避免内部catch,那么我很难让以下内容不会因为Error而崩溃code> 抛出在 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 run start 启动的 yarn 开发服务器的 未处理的拒绝(错误):promise2 错误。它指向promise2中抛出的Error。 Firefox 调试器跳转到我的代码之外的随机行并且不显示任何内容。

如果我在 promise2().then(...) 之后添加 catchError 就会被捕获。

如何避免内部陷阱?并从 promise2 捕获 Error,例如在 catch

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

将每个函数体包装在 try-catch block 中并不是一种选择,因为内部 .catch(...) 已经更加优雅。

抛出Error是一个最小的例子,当然,假设它是偶然发生的,并且promise2返回的 promise 预计会做一些有用的事情并且具有错误。

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

最佳答案

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

关于javascript - 如果使用 then ,是否需要在 Promise 中嵌套 catch?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56103683/

相关文章:

javascript - TypeError : is not a function. 绑定(bind)此的正确方法。 JS 中的引用

javascript - 在 jQuery/JavaScript 中使用 Promise 时遇到问题。脚本似乎没有等待

已声明但未使用的 Typescript 私有(private)属性

javascript - 如何强制 VSCode 使用本地安装的 TypeScript

javascript - promise 拒绝可能未处理的错误 :

javascript - Node.js 使用 Promise 递归下载分块数组

javascript - 通过将 this.setState 设置为空函数来响应 : Is it possible to prevent state update after unmount,?

javascript - 基本名称无法连接 react 路由器

javascript - JQuery 将输入掩码应用于字段 onfocus 并删除 onblur 以避免占位符文本出现问题

javascript - Angular 2 - 在嵌套路由中找不到模块