Вопрос по javascript, for-loop, settimeout – Первый из них не сработает; как правило, не рекомендуется передавать строки

3

ичок в 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 в каждом случае ... это просто, что только с последней итерацииза цикл выполняет функцию на самом деле.

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

Как говорит Dark Slipstream: у вас есть 0 в задержке для тайм-аута. Попробуйте с задержкой, напримерsetTimeout(function () { takeStep(nextAnt, mouseclickX, mouseclickY, 10) }, 10); James Khoury
Я прошу прощения. Я также установил задержку 10 внутри цикла, но я случайно удалил параметр времени в посте. Michael Phillips

Ваш Ответ

2   ответа
0

то зачем беспокоиться о 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);
    }
}
Когда я пытаюсь положить весьсделай шаг вызов функции в виде строки или, если я использую член nodeList [] в анонимной функции, интерпретатор сообщает мне, что первый параметр не определен в функции takeStep. Я думаю, что это проблема переменной области. Michael Phillips
Я прошу прощения. ябыл Задержка 10 внутри цикла, но я случайно удалилвремя параметр в посте.nextAnt.count свойство используется как частьусловие всделай шаг функция и на самом деле устанавливается в обоих (опять же, извините!).nextAnt.member был только для отладки итераций цикла. Michael Phillips
Первый из них не сработает; как правило, не рекомендуется передавать строкиsetTimeout() Pointy
Причина, по которой я вообще использовал setTimeout (согласно вашему коду после «или этого»), была в том, чтобы попытаться смоделировать всех муравьев, движущихся одновременно (в отличие от серийно). Такое поведение я получаю, когда беру вызовы setTimeout изза петля. Michael Phillips
8

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

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

(function(a,b,c){
     setTimeout(function(){
                           takeStep(a,b,c,10)}, 0);
      })(nextAnt, mouseclickX, mouseclickY);
Ооооо .. Я думаю, я понял это сейчас! Итак, такi во всех трех вызовах setTimeout фактически все еще находится "в области видимости" все время цикла for. я нашел этодругой пост что обсуждает ту же проблему. Дикий. Странно, что переменная область видимости может достигать одного уровня замыкания, но не двух. Во всяком случае, очень круто. Еще раз спасибо! Michael Phillips
Ух ты. Ты в порядке. Это работает. Этоукупорочные вещь? Я бы подумал, что параметры, передаваемые каждой итерации setTimeout, по своей природе будут частными, но, очевидно, это не так. Я думаю, теперь мой вопрос, почему они являются частными, когда я звоню за пределамиза цикл? Я должен обдумать это некоторое время. Это мое понимание переменной области в пределахза неправильный цикл или мое понимание того, как работает setTimeout? Благодаря тонну. Michael Phillips

Похожие вопросы