这是我的代码
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
,
请你告诉我麻烦吗?以及如何继续参加我的目标?提前谢谢你,对不起我的英语:)
答案 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}) ;
}) ;
}