我觉得这应该很容易,但我已经在上面挣扎了一段时间。
我有看起来像这样的代码(显然这是一个简化的示例)。
getPromise(param1, param2)
.then(function (results) {
// do something that causes an error:
var err1 = new Error()
throw err1;
})
.then(function (results) {
getAnotherPromise(param1)
.then(function (res) {
// do something else that might cause an error:
var err2 = new Error()
throw err2;
})
})
.then(function (results) {
// deal with the results of above code
})
.fail(function (error) {
// handle error
})
问题是err2
永远不会导致调用.fail
处理程序。 err1
按预期处理,但err2
只是消失了。我尝试在负责生成err2
的.then
之后添加另一个.fail
处理程序,这些只是重新抛出err2
,但这并没有改变任何东西。
如何编写一个同时处理err1
和err2
的错误处理程序?
>除非你return
,否则Q
无法处理嵌套承诺。因此,您的代码应如下所示:
getPromise(param1, param2).then(function (results) {
// do something that causes an error:
throw new Error('error 1');
}).then(function (results) {
return getAnotherPromise(param1).then(function (res) {
// do something else that might cause an error:
throw new Error('error 2');
})
}).then(function (results) {
// deal with the results of above code
}).fail(function (error) {
// handle error
})
实际上,承诺值和错误一样被传播,因此您可以通过以下方式编写代码:
getPromise(param1, param2).then(function (results) {
// do something that causes an error:
throw new Error('error 1');
}).then(function (results) {
return getAnotherPromise(param1)
}).then(function (res) {
// do something else that might cause an error:
throw new Error('error 2');
}).then(function (results) {
// deal with the results of above code
}).fail(function (error) {
// handle error
})