在打字稿承诺中捕捉错误

时间:2016-11-01 23:53:19

标签: angular typescript error-handling ecmascript-6 es6-promise

Angular2对于链式承诺具有非常有用的promises错误捕获机制。然而,通常的情况(至少对我而言)是在前一个解析处理程序中调用的promise。这是因为需要在开始下一个承诺之前处理信息。例如:

io.on('connection', function(socket){

}

所以,问题是 - 如果我想以最简单的方式捕获所有处理程序中的所有错误(让我们省略异常的类型 - 假设我只需要记录错误任何错误 - 不分开处理它们。)

根据我的理解,在代码周围放置一个try {} catch(错误)将无法捕获从Promise处理程序抛出的错误。

使用上面的代码 - 我是否需要在每个Promise处理程序中添加try / catch,或者我可以使用外部(第一个)promise的.catch()方法吗?

2 个答案:

答案 0 :(得分:7)

链接承诺的一种方法是在then函数内返回一个promise,如下所示:

method1()
  .then(response1 => {
    // ... do something
    return method2(response1);
  })
  .then(response2 => {
    // ... do something
    return method3(response3);
  })
  .catch(error => handleError(error))
  .finally(() => handleFinally())

如果所有承诺都按预期成功解决,所有方法都会按顺序调用(method1 -> method2 -> method3 -> handleFinally)。

当一个promise失败时,将跳过所有后续内容并调用catch。假设method2失败,我们有这一系列调用:method1 -> method2 -> handleError -> handleFinally

现在假设我们要忽略method2中的错误,我们可以为此调用添加一个catch语句:

method1()
  .then(response1 => {
    // ... do something
    return method2(response1)
      .catch(error2 => silentlyHandleError(error2));
  })
  .then(response2 => {
    // ... do something
    return method3(response3);
  })
  .catch(error => handleError(error))
  .finally(() => handleFinally())

请注意,catch不得放在主要的承诺链中。下一个块解释了一点:

method1()
  .then(response1 => {
    // ... do something
    return method2(response1);
  })
  .catch(error => silentlyHandleError(error)) // catchs error1 and error2
  .then(response2 => {
    // ... do something
    return method3(response3);
  })
  .catch(error => handleError(error))
  .finally(() => handleFinally())

答案 1 :(得分:1)

让每个承诺返回嵌套的承诺,并且顶级承诺具有.catch(..)