【问题标题】:Using $q, struggling to get rejections to cascade in AngularJS使用 $q,努力让拒绝在 AngularJS 中级联
【发布时间】:2015-01-05 10:16:48
【问题描述】:

我有一系列承诺,依赖于其他完成,并希望将它们“然后”在一起以获得代表整个序列完成的单个承诺。这似乎工作正常,但是我似乎没有任何失败来级联承诺链,因为它们似乎应该从文档中执行,这里有一个代码示例来说明我正在努力解决的问题:

  var deferred = $q.defer();
  deferred.resolve();

  var resolvedPromise = deferred.promise;
  var rejectedPromise = $q.reject('rejected');

  var aPromise = resolvedPromise.then(rejectedPromise);

  aPromise.then(function () {
    console.log('promise fulfilled');
  }, function () { 
    console.log('promise rejected'); 
  });

The same in Plunker

我希望记录“承诺被拒绝”,但我却得到“承诺已履行”。有什么想法可以实现我想要的行为吗?

【问题讨论】:

    标签: javascript angularjs promise angular-promise


    【解决方案1】:

    JBNizet 的回答很好,但我认为有些事情需要澄清。

    then 函数承诺将忽略任何传递给它的函数,而不是函数。所以当你有这样的代码时:

    myPromise.then(otherPromise)
    

    整个otherPromise 部分被完全忽略。这样做的理由是,由于 Promises/A+ 没有指定 catch 方法,因此您需要能够执行 .then(null, errHandler) 来处理错误,而无需更改已解决的承诺值本身。

    【讨论】:

      【解决方案2】:

      那是因为你没有从已解决的成功回调中返回被拒绝的承诺:

      var aPromise = resolvedPromise.then(function() {
          return rejectedPromise;
      });
      

      还要注意,要构造一个已解决的承诺,您可以简单地使用

      var resolvedPromise = $q.when('result');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-09
        • 2012-01-15
        • 1970-01-01
        • 2021-02-19
        • 2020-06-08
        • 2019-04-24
        • 2015-12-31
        相关资源
        最近更新 更多