Вызов функции setTimeout в цикле - PullRequest
3 голосов
/ 13 мая 2011

Я новичок в javascript и пытаюсь вызвать функцию, используя setTimeout из цикла для . Цикл выполняется для каждого члена nodeList.

Я обнаружил, что функция, которую я вызываю с помощью setTimeout, фактически выполняется только во время последней итерации цикла. В приведенном ниже примере я хотел бы сделать три отдельных вызова setTimeout, но обнаружил, что первые два вызова игнорируются.

function moveants(e, stepdistance) {

    . . . . .

    for(var i = 0; i < 3; i++)
    {
        var nextAnt = antgroup.childNodes[i]
        nextAnt.count = 0;
        nextAnt.member = i;
        setTimeout(function () { takeStep(nextAnt, mouseclickX, mouseclickY, 10) }, 0);
    }
}

function takeStep(ant, destX, destY, stepDistance) {

    . . . .

    . . . .

    if( condition )
    {
        return;
    }
    else
    {
        takeStep(ant, destX, destY, stepDistance);
    }
}

Я видел других сообщений , в которых описывается несколько вызовов setTimeout. Удивительно (для меня), множественные вызовы будут работать, если я просто выну их из цикла для следующим образом.

    setTimeout(function () { takeStep(antgroup.childNodes[0], 
         mouseclickX, mouseclickY, 10) }, 10);
    setTimeout(function () { takeStep(antgroup.childNodes[1], 
         mouseclickX, mouseclickY, 10) }, 10);
    setTimeout(function () { takeStep(antgroup.childNodes[2], 
         mouseclickX, mouseclickY, 10) }, 10);

Я просто не могу понять, почему существует разница между вызовом их из цикла для и вызовом их вне одного цикла.

Я получаю действительные возвращаемые значения от вызова setInterval в каждом случае ... просто, только с последней итерацией цикла для функция действительно выполняется.

Заранее спасибо за любую помощь.

Ответы [ 2 ]

8 голосов
/ 13 мая 2011

nextAnt будет перезаписываться в каждом цикле, поэтому takeStep () будет вызываться 3 раза, но всегда с одинаковыми аргументами.

Вы можете попробовать это вместо:

(function(a,b,c){
     setTimeout(function(){
                           takeStep(a,b,c,10)}, 0);
      })(nextAnt, mouseclickX, mouseclickY);
0 голосов
/ 13 мая 2011

Если вы не устанавливаете задержку, то зачем беспокоиться о setTimeout?

В цикле ваша задержка установлена ​​на 0, вне цикла, который вы использовали 10. Кроме того, вне цикла, который вы назначилизначения для подсчета и членства, но не вне цикла?

Попробуйте это:

function moveants(e, stepdistance)
{
    for (var i = 0; i < 3; i++)
    {
        setTimeout("takeStep(antgroup.childNodes[i], mouseclickX, mouseclickY, 10)", 0);
    }
}

или это:

function moveants(e, stepdistance)
{
    for (var i = 0; i < 3; i++)
    {
        takeStep(antgroup.childNodes[i], mouseclickX, mouseclickY, 10);
    }
}
...