可能重复:
Passing functions to setTimeout in a loop: always the last value?
我有以下代码:
var points = [{
id1 : 1,
id2 : 9,
lat : 44,
lng : 24
},{
id1 : 2,
id2 : 7,
lat : 13,
lng : 29
}];
当我尝试为数组点中的每个对象创建超时时,它只更新最后一个元素
for (var i in points){
setInterval(function(){
drivePoint(points[i], i)
}, 1000);
}
其中,驱动点是发出ajax请求的函数:
function drivePoint(point, i){
$.ajax({
type: "POST",
url: 'url',
data: points[i]
}).done(function(o){
var data = $.parseJSON(o);
points[i].lat = data['lat'];
points[i].lng = data['lng'];
});
}
drivePoint的想法是更新给定点的坐标,但问题是它只更新了最后一个,但是有多少个对象在点变量中而不是for(var i in points)循环来写这个
setInterval(function(){
drivePoint(points[0], 0)
}, 1000);
setInterval(function(){
drivePoint(points[1], 1)
}, 1000);
一切正常
无法理解问题在哪里
答案 0 :(得分:1)
这里的问题是,当你的函数被执行时,i
将被设置为循环中的最后一个值,因此在执行drivePoint()
时将使用它。但是你真的需要为每个点分别进行间接调度吗?你可以让你的间隔循环遍历所有值吗?
setInterval(function() {
for (var i in points) {
drivePoint(points[i], i);
}
}, 1000);