eval и setTimeout в цикле - PullRequest
       21

eval и setTimeout в цикле

0 голосов
/ 22 июля 2011

Я держу строки кода в массиве и пытаюсь запускать их ячейка за ячейкой с помощью setTimeout ().

Это хорошо выполняет код:

for (i=0; i<restorePoints.length; i++){
    eval(restorePoints[i]);
}

, но я хочуиметь небольшую задержку между каждой итерацией: я хочу использовать setTimeout () вместо eval ().по какой-то причине ничего из этого не работает:

for (i=0; i<restorePoints.length; i++){
    setTimeout(restorePoints[i],1000);
}

или

for (i=0; i<restorePoints.length; i++){
    setTimeout(eval(restorePoints[i]),1000);
}

как мне это сделать?спасибо

Ответы [ 2 ]

2 голосов
/ 22 июля 2011

Цикл быстрый.Это создаст все таймауты подряд, поэтому все тайм-ауты будут срабатывать одновременно.Вы можете либо сделать время зависимым от переменной цикла, то есть увеличить время на каждой итерации, либо, что я бы сделал, использовать только один тайм-аут и рекурсивный вызов:

(function() {
    var data = restorePoints;
    var run = function(i) {
        setTimeout(function() {
            var entry = data[i];
            if(entry) {
                eval(entry);
                run(i+1);
            }
        }, 1000);
    };
    run(0);
}());

Обратите внимание, чтоесть разница между eval(string) и setTimeout(string, ...), кроме задержки:

eval оценит параметр в текущей области, тогда как setTimeoutsetInterval) оценит его в глобальномсфера.

Это может иметь отношение к вам.

2 голосов
/ 22 июля 2011

Если вы собираетесь сделать это любым из этих способов, вам нужно обернуть вызов функции в анонимную функцию:

for (i=0; i<restorePoints.length; i++){
    setTimeout(function(){eval(restorePoints[i]}),1000);
}

В противном случае вы не устанавливаете eval для запуска в течение тайм-аута, вы устанавливаете результат выполнения кода Javascript (независимо от того, что это может быть в этом случае) как вещь, против которой setTimeout работает.

...