AngularJS:$ Q等待所有,即使拒绝1 [英] AngularJS: $q wait for all even when 1 rejected
问题描述
我一直在试图等待一对夫妇承诺有角的$ Q但似乎没有选项设置为等待所有,即使一个承诺未来被拒绝。
我创建了一个例子( http://jsfiddle.net/Zenuka/pHEf9/21/ ),我想拒绝当所有的承诺都解决了要执行的功能/,这可能吗?
是这样的:
I've been trying to wait for a couple of promises with Angular's $q but there seems to be no option to 'wait for all even when a promis is rejected'. I've created an example (http://jsfiddle.net/Zenuka/pHEf9/21/) and I want a function to be executed when all promises are resolved/rejected, is that possible? Something like:
$q.whenAllComplete(promises, function() {....})
编辑:在这个例子中你看到第二个服务出现故障,并立即之后,在 $ q.all(功能),然后(...,功能(){...})。
正在执行。我想等完成第五承诺。
In the example you see that the second service fails and immediately after that the function in $q.all().then(..., function(){...})
is being executed. I want to wait for the fifth promise to be completed.
推荐答案
好吧,我Implemeted一个基本版本我自己(我只是想等待承诺的数组)。任何人都可以扩展这一或者,如果他们想:-)营造一个更清洁的版本
检查的jsfiddle看到它在行动: http://jsfiddle.net/Zenuka/pHEf9/
Ok, I've implemeted a basic version myself (I only want to wait for an array of promises). Anyone can extend this or create a cleaner version if they want to :-) Check the jsfiddle to see it in action: http://jsfiddle.net/Zenuka/pHEf9/
angular.module('test').config(['$provide', function ($provide) {
$provide.decorator('$q', ['$delegate', function ($delegate) {
var $q = $delegate;
// Extention for q
$q.allSettled = $q.allSettled || function (promises) {
var deferred = $q.defer();
if (angular.isArray(promises)) {
var states = [];
var results = [];
var didAPromiseFail = false;
if (promises.length === 0) {
deferred.resolve(results);
return;
}
// First create an array for all promises with their state
angular.forEach(promises, function (promise, key) {
states[key] = false;
});
// Helper to check if all states are finished
var checkStates = function (states, results, deferred, failed) {
var allFinished = true;
angular.forEach(states, function (state, key) {
if (!state) {
allFinished = false;
}
});
if (allFinished) {
if (failed) {
deferred.reject(results);
} else {
deferred.resolve(results);
}
}
}
// Loop through the promises
// a second loop to be sure that checkStates is called when all states are set to false first
angular.forEach(promises, function (promise, key) {
$q.when(promise).then(function (result) {
states[key] = true;
results[key] = result;
checkStates(states, results, deferred, didAPromiseFail);
}, function (reason) {
states[key] = true;
results[key] = reason;
didAPromiseFail = true;
checkStates(states, results, deferred, didAPromiseFail);
});
});
} else {
throw 'allSettled can only handle an array of promises (for now)';
}
return deferred.promise;
};
return $q;
}]);
}]);
这篇关于AngularJS:$ Q等待所有,即使拒绝1的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!