JavaScript同时循环将每个数据逐个传递到另一个函数

JavaScript同时循环将每个数据逐个传递到另一个函数,javascript,while-loop,maps,logic,Javascript,While Loop,Maps,Logic,我在JavaScript中的while循环中遇到了一些逻辑问题。基本上,我尝试循环一个坐标列表,在每个坐标上,我执行moveNext(),它将绘制一个标记并循环,直到while循环结束。代码如下: var k = 1; while(k < pointArr.length){ var coordx = pointArr[k].x; var coordy = pointArr[k].y; window.se

我在JavaScript中的while循环中遇到了一些逻辑问题。基本上,我尝试循环一个坐标列表,在每个坐标上,我执行moveNext(),它将绘制一个标记并循环,直到while循环结束。代码如下:

var k = 1;
        while(k < pointArr.length){
            var coordx = pointArr[k].x;
            var coordy = pointArr[k].y;
            window.setTimeout(function(){
                moveNext(coordx, coordy, k);   
            },500);
            k++;
        }
但是,使用这些代码,它不会在地图上执行逐点打印标记设置超时。相反,它会一直循环直到while循环结束,并在那里绘制最后一个标记。有导游吗


提前感谢。

导致此问题的原因是setTimeout在当前方法的执行结束后执行传递的方法。由于传递给setTimeout的方法的作用域包含在当前方法的作用域内(请参阅),因此moveNext方法将只获取coordX和coordY的最后值

您可以通过将setTimeout调用添加到即时函数中来解决此问题。这样,参数coordX和coordY将与函数立即执行时保持相同,并设置进一步执行的超时时间

var pointArr = [{x: 1, y: 1}, {x: 2, y: 2}, {x: 3, y: 3}];

var k = 0;
while(k < pointArr.length){
  var coordx = pointArr[k].x;
  var coordy = pointArr[k].y;

  (function(coordx, coordy, k) {
    window.setTimeout(function(){
      moveNext(coordx, coordy, k);   
    },500);
  })(coordx, coordy, k);

  k++;
}

function moveNext(x, y, k) {
  alert(x + ' - ' + y + ' - ' + k);
}
var pointArr=[{x:1,y:1},{x:2,y:2},{x:3,y:3}];
var k=0;
while(k
如果要在每个绘图之间等待500 ms,可以执行以下操作:

var pointArr = [{x: 1, y: 2}, {x: 2, y: 2}, {x: 3, y: 3}];

function moveToNextPoint(k) {
  if(k < pointArr.length) {
    var coordx = pointArr[k].x;
    var coordy = pointArr[k].y;
    moveNext(coordx, coordy, k);

    setTimeout(function() {
      moveToNextPoint(k + 1);
    }, 500);
  }
}


function moveNext(x, y, k) {
  alert(x + ' - ' + y + ' - ' + k);
}

moveToNextPoint(0);
var pointArr=[{x:1,y:2},{x:2,y:2},{x:3,y:3}];
函数moveToNextPoint(k){
if(k<点阵列长度){
var coordx=pointArr[k].x;
var coordy=pointArr[k].y;
moveNext(coordx,coordy,k);
setTimeout(函数(){
moveToNextPoint(k+1);
}, 500);
}
}
函数moveNext(x,y,k){
警报(x+'-'+y+'-'+k);
}
moveToNextPoint(0);

如果您想使用forEach而不是while,也许可以

timeout = 500;
pointArr.forEach(function(coord,index){
    setTimeout(function(){
        moveNext(coord.x, coord.y, index);
    }, timeout * index);
});
希望能有所帮助


ps:我不喜欢使用while,因为如果您错误地填充了条件,它可能会无限循环JAVA标记已删除。@AndyBrown但你有什么想法吗?因为我不明白为什么它一直循环到最后。不,它不起作用。当我在moveNext()中打印出坐标x和坐标y时,我会得到一个坐标列表,但它不会一步一步地绘制到地图上。有什么想法吗?对我有用。在javascript控制台中运行我的答案中的代码。但我希望它能以这种方式工作,路由有10个点。对于第一个点,我画了一个标记,在移动到另一个点之前我停留了10秒钟。目前的解决方案就像我在500后绘制标记,然后循环通过每个点,几秒钟内不停止。有什么想法吗?看看我的答案。我希望我明白你的意思你的解决方案有效!这正是我想做的!非常感谢!!:)
timeout = 500;
pointArr.forEach(function(coord,index){
    setTimeout(function(){
        moveNext(coord.x, coord.y, index);
    }, timeout * index);
});