如何在Q .then()回调中传播嵌套错误

时间:2013-12-20 19:10:55

标签: javascript node.js q

我觉得这应该很容易,但我一直在努力奋斗。

我的代码看起来像这样(显然这是一个简化的例子)。

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只是消失了。我已经尝试在负责生成.fail的{​​{1}}之后添加另一个.then处理程序,该err2只会重新抛出err2,但这不会改变任何内容。

如何编写一个处理err1err2的错误处理程序?

1 个答案:

答案 0 :(得分:3)

除非Q,否则

return无法处理嵌套的承诺。所以,你的代码应该是这样的:

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
})

实际上,promise值既有传播也有错误,所以你可以用以下方式编写代码:

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
})