【问题标题】:How can I trigger a single error handler with nested promises?如何使用嵌套的 Promise 触发单个错误处理程序?
【发布时间】:2013-12-09 16:31:24
【问题描述】:

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

当我在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);
});

【问题讨论】:

  • 当你运行这个时你会得到什么输出?
  • @user568109 添加了更多细节并修正了一些错别字。
  • 你能说出你为什么不想要fail吗?有必要(这个或then)执行错误处理程序。默认情况下没有错误处理程序。它只会遇到错误并停止。

标签: node.js promise q


【解决方案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);
});

【讨论】:

    猜你喜欢
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 2014-03-15
    相关资源
    最近更新 更多