如何在$ http.get的promise响应中使用外部变量

时间:2014-05-19 13:23:16

标签: javascript angularjs closures

这是我的代码

for (var i=0; i<5; i++) {
    var url = generate_url(i) ;
    $http.get(url).then(function(response){
        var param2 = response.data.param2
        $scope.outputData.push({'index':i, 'param':param2}) ;
    }) ;
}

在这个例子中,我想在$scope.outputData中获得一个数组,其数据类似于:

[
  {'index':0,param:'a'},
  {'index':1,param:'b'},
  {'index':2,param:'c'},
  {'index':3,param:'d'},
  {'index':4,param:'e'},
]

但我得到的是这样的数据:

[
  {'index':4,param:'a'},
  {'index':4,param:'b'},
  {'index':4,param:'c'},
  {'index':4,param:'d'},
  {'index':4,param:'e'},
]

在这种情况下,我所说的外部数据是变量i

请你告诉我麻烦吗?以及如何继续参加我的目标?提前谢谢你,对不起我的英语:)

2 个答案:

答案 0 :(得分:4)

您可以在i变量上创建一个闭包,以确保它在使用时仍具有您希望它具有的值。

for (var i=0; i<5; i++) {
    (function(counter) {
        var url = generate_url(i);
        $http.get(url).then(function(response){
            var param2 = response.data.param2
            $scope.outputData.push({'index':counter, 'param':param2}) ;
        });
    }(i));
}

但是如果结果数组的排序很重要,则必须创建一个临时数组,然后在index上对其进行排序。

如果您不想处理任何已完成的请求,则可以使用$q.all

这样的事情:

var promises = {};
for (var i=0; i<5; i++) {
    var url = generate_url(i) ;
    promises[i] = $http.get(url);
}
$q.all(promises).then(function(result) {
  for (index in result) {
      var param2 = result[index].data.param2
      $scope.outputData.push({'index':index, 'param':param2}) ;
  }
});

这也应该保留顺序。

$q的文档为here

答案 1 :(得分:1)

这是一个关闭问题,正确的方法是

for (var i=0; i<5; i++) {
   getData(i);
}
var getData=function(index) {
     var url = generate_url(index) ;
    $http.get(url).then(function(response){
        var param2 = response.data.param2
        $scope.outputData.push({'index':index, 'param':param2}) ;
    }) ;
}