Angular2对于链式承诺具有非常有用的promises错误捕获机制。然而,通常的情况(至少对我而言)是在前一个解析处理程序中调用的promise。这是因为需要在开始下一个承诺之前处理信息。例如:
io.on('connection', function(socket){
}
所以,问题是 - 如果我想以最简单的方式捕获所有处理程序中的所有错误(让我们省略异常的类型 - 假设我只需要记录错误任何错误 - 不分开处理它们。)
根据我的理解,在代码周围放置一个try {} catch(错误)将无法捕获从Promise处理程序抛出的错误。
使用上面的代码 - 我是否需要在每个Promise处理程序中添加try / catch,或者我可以使用外部(第一个)promise的.catch()方法吗?
答案 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(..)