在settimeout期间仅更新最后一个值

时间:2012-09-08 22:11:35

标签: javascript settimeout setinterval

  

可能重复:
  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);

一切正常

无法理解问题在哪里

1 个答案:

答案 0 :(得分:1)

这里的问题是,当你的函数被执行时,i将被设置为循环中的最后一个值,因此在执行drivePoint()时将使用它。但是你真的需要为每个点分别进行间接调度吗?你可以让你的间隔循环遍历所有值吗?

setInterval(function() {
    for (var i in points) {
        drivePoint(points[i], i);
    }
}, 1000);