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
问题)。