【问题标题】:What is the difference between using Promise.catch() and wrapping a Promise in try...catch?使用 Promise.catch() 和在 try...catch 中包装 Promise 有什么区别?
【发布时间】:2018-11-09 19:58:17
【问题描述】:

我今天正在听 Javascript 课,他们正在讲一些我以前没见过的东西,而且我不完全理解。我会尽量从记忆中重现

老师没有使用 Promise 的 catch 来处理错误,我已经习惯了,而是使用 try...catch 包裹 Promise 及其 thens。当我问他为什么这样做时,他说这是为了“同步”捕获错误。也就是说,而不是我习惯的以下格式(我使用的是伪代码)

someLibrary.someFunctionThatReturnsAPromise
.then(() => something)
.then(() => somethingElse)
.catch(err => reportError)

他这样做了

try {
 someLibrary.someFunctionThatReturnsAPromise
    .then(() => something)
    .then(() => somethingElse)
} 
catch(err) {
  reportError
}

这两种捕获错误的方法有什么区别? 如何包装异步的 Promise 以同步方式报告错误?

感谢您的任何见解!

【问题讨论】:

  • 第二个示例块只会捕获同步错误而不是异步错误。所以理论上,如果你不关心你的异步是否成功,只关心执行错误,它会是有效的。 try {} catch () {} 可以用来catch,如果你正在使用async/await,有没有可能老师在演示?

标签: javascript try-catch es6-promise


【解决方案1】:

try-catch 不会捕获 <somePromise>.then 周围的异步错误,因为正如您所注意到的,该块将在承诺完成/可能抛出之前退出。

但是,如果您使用的是async/await,那么try-catch 将捕获,因为该块将等待await

async function foobar() {
  try {
    await doSomePromise();
  } catch (e) {
    console.log(e);
  }
}

【讨论】:

    【解决方案2】:

    try/catch 版本只会在 initial(同步)代码运行时抛出错误时捕获错误 - 它不会捕获在任何 .then 中抛出的错误年代:

    try {
      Promise.resolve()
        .then(() => {
          throw new Error()
        });
    } catch(e) {
      console.log('caught');
    }

    因此,在您的代码中使用try/catch 捕获错误的唯一方法是someLibrary.someFunctionThatReturnsAPromise 同步抛出。另一方面,.then/.catch 版本将捕获 any 错误(并且几乎可以肯定是更可取的)。

    【讨论】:

      【解决方案3】:
      1. 在那之后赶上(第一个例子) 这是一种仅处理您的承诺中的错误的简短方法。它与 .then(null, (err) => reportError) as then 有两个参数:promise 的已完成和已拒绝状态。
      2. try catch 块(第二个示例) 简而言之 - 是处理代码块的常用方法。如果你从你的代码中得到的东西不仅失败了,而且在它之后做一些事情。 Try/catch 仅在同步模式下工作,这就是为什么如果您使用异步代码,您应该将其包装起来,例如以异步/等待方式。

      实际上你也可以在 catch 之后使用 3 语句 - finally,但这取决于)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-09
        • 1970-01-01
        • 2017-08-07
        • 1970-01-01
        • 2012-11-20
        • 2012-01-17
        • 2011-02-20
        相关资源
        最近更新 更多