使用 $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');
});
我希望记录 "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)
来处理错误,而不更改承诺值本身(如果它已解决)。
我有一系列 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');
});
我希望记录 "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)
来处理错误,而不更改承诺值本身(如果它已解决)。