并行$ http调用使用相同的对象

时间:2017-03-20 11:34:45

标签: angularjs

我在控制器中有以下功能:

this.someFunction = function() {
    var filter = {
        type: 'E'
    };

    someService.httpPostFunction(filter).then(function(response) {
        console.log(response);
    });

    filter.type = 'H';
    someService.httpPostFunction(filter).then(function(response) {
        console.log(response);
    });

    filter.type = 'W';
    someService.httpPostFunction(filter).then(function(response) {
        console.log(response);
    });
};

这是someService.httpPostFunction

httpPostFunction: function(filter) {
    var deferred = $q.defer();
    var httpPromise = $http.post(url,filter)
    .then(function(response) {
        deferred.resolve(response.data);
        }, function(error) {
            deferred.reject(error.data);
    });
    return deferred.promise;
}

someService.httpPostFunction会根据filter.type向我返回不同的数据。我希望他们并行运行。但是,即使在第一次filter.type来电时,此功能的行为就像'W'设置为httpPostFunction一样。

创建filter变量的副本,更改副本的type然后传递副本会给我正确的结果,但这是不可行的。如何使用相同的变量使代码正常工作?

2 个答案:

答案 0 :(得分:2)

您可以使用数组存储promises,然后使用$ q.all来捕获所有承诺,如下所示

NSObject *str;
NSMutableArray* strongArray=[[[NSMutableArray alloc]initWithArray:arr]mutableCopy];
for (str in arr)
{

    if ([str isKindOfClass:[NSArray class]]) {
        if (!(str==[NSNull null])) {
            str=[[self ArrayCheckforNull:(NSMutableArray *)str]mutableCopy];
            [strongArray removeObjectAtIndex:0];
            [strongArray addObject:str];
        }
        else
        {
            [strongArray removeObject:str];
            [strongArray addObject:@"----"];

        }

    }
    else if ([str isKindOfClass:[NSDictionary class]]) {
        if (!(str==[NSNull null])) {
            str=[[self jsonCheckforNull:(NSMutableDictionary*)str]mutableCopy];
            [strongArray removeObjectAtIndex:0];
            [strongArray addObject:str];

        }
        else
        {
            [strongArray removeObject:str];
            [strongArray addObject:@"----"];
        }

    }

    else {

        if (str ==[NSNull null]) {
            [strongArray removeObject:str];
            [strongArray addObject:@"----"];
        }


    }

}
return strongArray;

答案 1 :(得分:1)

您可以使用$q.all发送多个http请求并行

var filterObj = {
   type: ['E', 'H', 'W']
};
var arr = [];
for(item in filterObj.type){
   arr.push(someService.httpPostFunction(item))
}
$q.all(arr).then(function(responses) {
    console.log( responses[0].data);
    console.log( responses[1].data);
    console.log( responses[2].data); 

});