AngularJS多个$ http调用,有多个结果

时间:2015-08-06 11:38:57

标签: javascript angularjs

我有Id的列表,我希望所有联系我的API。

我这样做是这样的:

 var someFunct = function() {
      for (var i = 0; i < Apples.length; i++) {
       var Apple = Apples[i];
        $http.get("APIUrl" + Apple.Id).
        success(function (response) {
            for (var i = 0; i < response.Appleseeds.length; i++) {

                if(Apple.Appleseeds.Id == response.Appleseeds.Id)
                {
                    Apple.Size = response.Appleseeds.Size;
                }
            }               
        })

    }

问题在于Apple[2]已更改了值,其中Apple[0]Apple[1]保持不变。 response.Appleseeds有自己的ID列表。因此,我需要更改所有应用程序的大小,而不仅仅是Apple[2]

2 个答案:

答案 0 :(得分:5)

你关闭,改为使用闭包:

var someFunct = function () {
    for (var i = 0; i < Apples.length; i++) {
        (function (Apple) {
            $http.get("APIUrl" + Apple.Id)
            .success(function (response) {
                for (var i = 0; i < response.Appleseeds.length; i++) {

                    if (Apple.Appleseeds.Id == response.Appleseeds.Id) {
                        Apple.Size = response.Appleseeds.Size;
                    }
                }
            });
        })(Apples[i]);
    }
};

由于http不会立即发生,因此当您的代码中最后一次成功发生时,苹果已被更改。通过将其包装在一个封闭中,您可以使每个调用都拥有它自己的私有Apple。

答案 1 :(得分:1)

var deferred = $q.defer();
var someFunct = function() {
  for (var i = 0; i < Apples.length; i++) {
    $http.get("APIUrl" + Apples[i].Id).
    success(function (response) {
         deferred.resolve(response)              
    })
    return deferred.promise;
 }
}

someFunct().then(function(d)){
    // write your code here
   }