使用 $q,努力让拒绝级联 AngularJS

Using $q, struggling to get rejections to cascade in AngularJS

我有一系列 promise,依赖于其他的完成,我想 "then" 将它们放在一起以获得代表整个序列完成的单个 promise。这似乎工作正常但是我似乎无法在承诺链中级联任何失败,因为它们似乎应该从文档中做,这里有一个代码示例来说明我正在努力解决的问题:

  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

我希望记录 "promise rejected",但我得到 "promise fulfilled"。有什么想法可以实现我想要的行为吗?

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

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

另请注意,要构建已解决的承诺,您可以简单地使用

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

JBNizet 的回答很好,但我认为有一点需要澄清。

then 函数承诺将 忽略 除了函数之外的任何传递给它的东西。所以当你有代码时:

myPromise.then(otherPromise)

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