Javascript setTimeout с функцией в цикле for

Используя Javascript, я пытаюсь перебрать массив и выполнить функцию с задержкой по времени в каждом цикле. Это не работает:

<script type="text/javascript">
movesArray = new Array("s","s","s","s","s","s","s","s","s","s","s","s","s","s");
var pause = 100;
for (i=0; i<=14; i++)
{
    var t=setTimeout("ProcessKeypress(movesArray[i])", pause);
    pause = pause+100;
}
</script>

Однако, если я просто повторю это несколько раз, это сработает:

<script type="text/javascript">

var t=setTimeout("ProcessKeypress('s')", 100);
var t=setTimeout("ProcessKeypress('s')", 200);
var t=setTimeout("ProcessKeypress('s')", 300);
var t=setTimeout("ProcessKeypress('s')", 400);
var t=setTimeout("ProcessKeypress('s')", 500);

</script>

Проблема в том, что в некоторых случаях мне нужно будет повторить функцию несколько сотен раз (может быть, больше), что приведет к созданию большой веб-страницы. Есть ли способ перебрать массив и запустить функцию с задержкой по времени?


person Marcus    schedule 09.12.2011    source источник
comment
В этом столько плохого, что я даже не знаю, с чего начать ...   -  person Justin Thomas    schedule 09.12.2011
comment
Вы никогда не должны передавать строку в setTimeout ...   -  person ThiefMaster    schedule 09.12.2011
comment
Возможно, это не проблема, но вы ошиблись, добавляя одинарные кавычки в параметр firs для setTimeout. Попробуйте вместо этого var t=setTimeout("ProcessKeypress(movesArray[i])", pause);.   -  person Borodin    schedule 09.12.2011
comment
Почему -1? Я могу делать много неправильных вещей со своим кодом; но именно поэтому я задал вопрос здесь, чтобы получить представление о том, что мне следует изменить.   -  person Marcus    schedule 09.12.2011


Ответы (3)


Вы передаете строку «moveArray [i]». Просто избегайте строки

movesArray = new Array("s","s","s","s","s","s","s","s","s","s","s","s","s","s");
var pause = 100;
for (i=0; i<=14; i++)
{
    var t=setTimeout("ProcessKeypress(movesArray[" +i +"])", pause);
    pause = pause+100;
}
person jermel    schedule 09.12.2011
comment
Это решает проблему. Спасибо. - person Marcus; 09.12.2011

Используйте 1_. Вы можете запускать функцию с любым интервалом:

setInterval(function(){
    // do stuff
}, 300);

Кроме того, используйте function(){} внутри setTiemout вместо кода:

setTimeout(function(){
    // do stuff
}, pause);
person Purag    schedule 09.12.2011

Если вы хотите, чтобы каждая итерация цикла проходила с определенной временной задержкой после завершения предыдущей, то ваш способ выполнения будет иметь проблемы с индексом в массиве. Вот проблемы, которые я вижу:

  1. Ваш индекс не будет правильным, так как все вызовы ProcessKeypress() будут иметь i == 15.
  2. Также лучше передать setTimeout() фактическую функцию javascript, а не строку, которую она должна вычислить.
  3. И я также думаю, что обычно лучше просто установить следующий таймер, когда первый завершится, а не устанавливать их все сразу (хотя любой из них может работать).
  4. И ваш код увеличивался до movesArray[14], но у вас было не так много элементов в массиве. Лучше обращаться к массиву .length, чем жестко кодировать 14.

Мои предложения можно реализовать так:

<script type="text/javascript">
movesArray = new Array("s","s","s","s","s","s","s","s","s","s","s","s","s","s");
var i = 0;

function nextIteration() {
    ProcessKeypress(movesArray[i++]);
    if (i < movesArray.length) {
        setTimeout(nextIteration, 100);
    }
}

nextIteration();

</script>
person jfriend00    schedule 09.12.2011