如何使用嵌套的promises触发单个错误处理程序?

时间:2013-11-25 04:27:46

标签: node.js promise q

为什么deferred.reject()个调用中的任何一个都不会在最后触发.fail()处理程序?如何使用嵌套的promises触发单个错误处理程序?我需要嵌套的承诺来封闭。

当我在d1上触发拒绝时,它仍然会一直到d2的解析/拒绝。如果我将.fail()添加到d1的块中,那么它确实可以捕获拒绝。但这就是我想要避免的,每个嵌套承诺的.fail()处理程序。

var Q = require('q');

somePromise().then(function (v1) {

  var d1 = Q.defer();

  asyncFunc1(v2, function (err, v3) {
    if (!v3) 
      d1.reject(new Error('error'));
    else
      d1.resolve(true);

    return d1.promise.then(function (promise1Kept) {
      var d2 = Q.defer();
      asyncFunc2(v4, function (err, v5) {
        if (!v5)
          d2.reject(new Error('error'));
        else
          d2.resolve(true);
      });
      return d2.promise.then(function (promise2Kept) {
        console.log('end of promise chain');
      });
    });
  });
}).fail(function (err) {
  console.log('Error!');
  console.log(err);
});

1 个答案:

答案 0 :(得分:1)

不要混合回调和承诺或使用延迟。正如您所注意到的,当您需要手动执行所有操作时,很容易弄乱链。

var Q = require('q');
var func1 = Q.denodeify(asyncFunc1);
var func2 = Q.denodeify(asyncFunc2);

somePromise().then(function (v1) {
  return func1(v2);
}).then(function (v3) {
  if (!v3) throw new Error("error");

  return func2(v4);
}).then(function (v5) {
  if (!v5) throw new Error("error");

  console.log("end of promise chain");
}).fail(function (err) {
  console.log('Error!');
  console.log(err);
});