我有一组异步发生的ajax调用,在完成所有ajax调用之后,应该执行一些函数。我正在使用$ q.all()。then()。 $ q.all()的问题在于,即使其中一个ajax调用失败,该函数也不会被执行。我的要求是执行该功能,无论各个ajax调用是成功还是失败。我怎么能去做呢?
答案 0 :(得分:0)
使用$ q.allSettled而不是$ q.all解决了这个问题。 请参阅以下链接来装饰$ q.all功能
答案 1 :(得分:0)
您可以使用其他承诺解决承诺,这使您可以执行以下操作:
var urls = [...];
var promises = urls.map(function (url) {
return $http.get(url).then(null,
// error callback returns a new promise
function (response) { return $q.resolve(response); });
});
$q.all(promises).then(...);
答案 2 :(得分:0)
您可以使用此代码来实现此逻辑。
GroupPromise插件的定义。
//create a group promise function.
var GroupPromise = function(){
this.allPromise = [];
this.successPromises = [];
this.failurePromises = [];
}
//use this function to add promises which you want to resolve on success or error.
GroupPromise.prototype.add = function(promiseToAdd){
var promise = $q.defer();
var self = this;
promiseToAdd.then(function(){
var args = angular.copy(arguments);
args.push({state: 'success'});
self.successPromises.push(promise);
promise.resolve.apply(this, args);
}, function(){
var args = angular.copy(arguments);
args.push({state = 'failure'});
self.failurePromises.push(promise);
promise.resolve.apply(this, args);
});
this.allPromise.push(promise);
}
//use this to resolve all promises.
GroupPromise.prototype.resolveAll = function(successCallback, errorCallback){
var self = this;
$q.all(this.allPromise).then(function(){
//all API calls processed.
if(self.failurePromises.length === 0){
//no API fails
successCallback.call(self);
}else{
//some API fails
errorCallback.call(self);
}
});
}
使用GroupPromise插件。
//create an object of GroupPromise.
var myGroupPromise = new GroupPromise();
//add API call promises to queue.
angular.forEach([1,2,3,4], function(){
myGroupPromise.add($http.get(url));
});
//call for resolve all promises and pass the success and error callback.
myGroupPromise.resolveAll(successCallback, errorCallback);
答案 3 :(得分:-1)
你必须使用个人推迟,例如:
var myDefer = $q.defer();
myDefer.promise.then(function(result) {
}, function(rejected) {
});