angularJS中的$ q.all()

时间:2015-06-23 05:14:04

标签: ajax angularjs

我有一组异步发生的ajax调用,在完成所有ajax调用之后,应该执行一些函数。我正在使用$ q.all()。then()。 $ q.all()的问题在于,即使其中一个ajax调用失败,该函数也不会被执行。我的要求是执行该功能,无论各个ajax调用是成功还是失败。我怎么能去做呢?

4 个答案:

答案 0 :(得分:0)

使用$ q.allSettled而不是$ q.all解决了这个问题。 请参阅以下链接来装饰$ q.all功能

http://www.codeducky.org/q-allsettled/

答案 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(...);

小提琴:http://jsfiddle.net/j4b7pxmt/

答案 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) {

    });