使用Promise.catch()和将Promise包装在try ... catch之间有什么区别?

时间:2018-11-09 19:58:17

标签: javascript try-catch es6-promise

今天我正坐在一堂Javascript课上,他们讲的内容是我以前从未见过的,而且我还不太了解。我会尽力从记忆中重现

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

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

他这样做了

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

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

感谢您的见解!

3 个答案:

答案 0 :(得分:1)

仅当运行 initial (同步)代码时引发错误时,try/catch版本才会捕获该错误-它不会捕获任何{ {1}} s:

.then

因此,在代码中try { Promise.resolve() .then(() => { throw new Error() }); } catch(e) { console.log('caught'); }捕获错误的唯一方法是如果try/catch同步引发。另一方面,someLibrary.someFunctionThatReturnsAPromise / .then版本将捕获任何错误(并且几乎肯定是更可取的)。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

  1. 然后接住(第一个示例) 这是处理承诺中错误的一种捷径。与...相同 .then(null,(err)=> reportError) 然后采用两个参数:承诺的实现状态和拒绝状态。
  2. 尝试捕获块(第二个示例) 简而言之-是处理代码块的常用方法。如果您从代码中得到的结果不仅失败了,还需要采取一些措施。 Try / catch仅在同步模式下起作用,这就是为什么如果使用异步代码,则应将其包装起来,例如以异步/等待方式包装。

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