2014-05-19 17 views
4

这里承诺响应内外部变量是我的代码

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'}, 
] 

在这种情况下,externel数据T帽子我的意思是变量i,

请你能告诉我麻烦吗?我如何着手参加我的目标?谢谢你提前和对不起我的英文:)

回答

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

+0

这是正确的答案 –

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}) ; 
    }) ; 
} 
+1

您的解决方案也适用于我,但结果顺序不正确,但这不是问题。谢谢。 – user3172446