Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在设置超时期间仅更新最后一个值_Javascript_Settimeout_Setinterval - Fatal编程技术网

Javascript 在设置超时期间仅更新最后一个值

Javascript 在设置超时期间仅更新最后一个值,javascript,settimeout,setinterval,Javascript,Settimeout,Setinterval,可能重复: 我有以下代码: var points = [{ id1 : 1, id2 : 9, lat : 44, lng : 24 },{ id1 : 2, id2 : 7, lat : 13,

可能重复:

我有以下代码:

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);
}
其中,drive point是发出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的思想是更新给定点的坐标,但问题是它只更新最后一个点,但是如果不单独写入(var i in points)循环,那么points变量中有多少对象

setInterval(function(){
    drivePoint(points[0], 0)
}, 1000);

setInterval(function(){
    drivePoint(points[1], 1)
}, 1000);
一切正常


无法理解问题在哪里

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

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

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

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

这个问题是“JavaScript编程中最令人困惑的事情”的参赛者:-)问题是,
for··································。您需要使用常规的
for
循环加上Pointy所说的内容。注意,我认为
setTimeout()
可以更好地处理此类调用,因为它只运行一次。所以,设置一个驱动点,设置超时,设置下一个,等等,直到它完成。这可以通过包含迭代和列表的闭包范围变量来完成。请参阅:另一个例子:这个问题是“JavaScript编程最令人困惑的事情”的参赛者:-)问题是
for…in
是对象而不是数组,
points
是(对象的)数组。您需要使用常规的
for
循环加上Pointy所说的内容。注意,我认为
setTimeout()
可以更好地处理此类调用,因为它只运行一次。所以,设置一个驱动点,设置超时,设置下一个,等等,直到它完成。这可以通过包含迭代和列表的闭包范围变量来完成;除非我读错了,否则每个驱动点都应该间隔一秒钟进行调用,你所做的是循环中的所有点,然后迭代,然后再重复?我猜OP试图做的是每秒更新一个点,而不是每秒更新所有点。如果是这样,那么就需要在循环中使用
setTimeout()
的for循环。@JaredFarrish:Karl Johan的代码与问题中的代码几乎相同。再看看原作。这些时间间隔基本上是在同一时间开始的,它们有相同的持续时间,这意味着它们将在基本相同的时间执行。但我猜@nnnnnn是对的,这并不是真正想要的。@GrayStateiscomming-嗯,我和nnnnnnnn说的是同一件事…@JaredFarrish:我是说OP的代码没有按照你和@nnnnnn描述的方式计时,但是Karl Johan的代码确实有效地模拟了OP最初的代码计时,(但当然修复了
i
问题)。请再看一遍;除非我读错了,否则每个驱动点都应该每隔一秒钟调用一次,您所做的是在循环中执行所有点,然后进行迭代,然后再执行一次?我猜OP试图做的是每秒更新一个点,而不是每秒更新所有点。如果是这样,则使用
setTimeout()进行for循环
循环内部是需要的。@JaredFarrish:Karl Johan的代码与问题中的代码几乎相同。再看一看原始代码。时间间隔基本上是在同一时间开始的,它们的持续时间相同,这意味着它们将在基本上相同的时间执行。但我猜@nnnnnn是正确的,这是正确的不是真正想要的。@graystateiscoming-嗯,我和NNNN说的是同一件事…@JaredFarrish:我是说OP的代码没有按照您和@nnnnnn描述的方式计时,但是Karl Johan的代码确实有效地模拟了OP的原始代码计时(当然修复了
I
问题)。