Не могу уснуть внутри петли - PullRequest
2 голосов
/ 27 марта 2012

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

for (var i=0 ; i < 10 ; i++) {
    document.write (i + "<br>");
    // I want to wait 1 second here
}

Этоодин пример моих тысяч неудачных попыток:

function writeMsg (index) {
    document.write (index + "<br>");
}

for (var i=0 ; i < 10 ; i++) {
    setTimeout (writeMsg(i), 1000);
}

Есть идеи, как заставить это работать?

Ответы [ 5 ]

9 голосов
/ 27 марта 2012

Эта функция больше похожа на обычный цикл for, но не на

. Необходимо учитывать, что for получает 3 аргумента между точками с запятой.

  1. Перед запуском (т. е. var i=0 вы определяете переменную)
  2. Условие перед повторным запуском кода (т. е. i < 10, когда мне меньше 10)
  3. Действие при каждом повторном завершении кода (i++ добавьте один к i)

Код

(function() {
    // Define a variable
    var i = 0,
        action = function() {
            // Condition to run again
            if (i < 10) {
                document.write(i + "<br>");

                // Add one to i
                i++;
                setTimeout(action, 1000);
            }
        };

    setTimeout(action, 1000);
})();

Вот jsfiddle для этого кода, демонстрирующий его работу: http://jsfiddle.net/sg3s/n9BNQ/

4 голосов
/ 27 марта 2012

Вы передаете возвращаемое значение вызова функции в setTimeout вместо функции. Попробуйте следующий код:

for (var i = 0; i < 10; i++) {
    (function(i) {
        setTimeout(function() {
            writeMsg(i);
        }, 1000*i);
    })(i);
}

В случае, если вам интересно, почему вызов заключен в анонимную функцию: без этой функции каждый обратный вызов setTimeout получит одинаковое i, поэтому при срабатывании обратных вызовов всегда будет 10. Анонимная функция создает новый i внутри, который не связан с переменной цикла.

1 голос
/ 27 марта 2012

Все 10 тайм-аутов основаны на времени вызова setTimeout (). Итак, все они запускаются одновременно.

for (var i=0; i < 10; i++) {
    (function(idx){
        setTimeout(function(){
            document.write(idx+"<br/>");
        },1000*idx);
    })(i);
};
1 голос
/ 27 марта 2012

Классическая проблема функции в цикле.Один архетипический раствор:

function createCallback(i) {
    return function () {
        writeMsg(i);
    };
}

function writeMsg (index) {
    document.write (index + "<br>");
}

for (var i=0 ; i < 10 ; i++) {
    setTimeout (createCallback(i), 1000*i);
}
0 голосов
/ 16 сентября 2016

попробуйте это, это определенно поможет всем, кто думает, как заставить это работать. Wait свойство внутри For Loop ... попробуйте этот код в этом URL http://www.shopjustice.com/the-collections/C-10329.

var var2;
var tmp;
var evt;
var i=0;
var res = document.getElementsByClassName('mar-plp-filter-content nav nav--stacked')[0].children.length;
tmp = document.getElementsByClassName('mar-plp-filter-content nav nav--stacked')[0].children;
function myfunc()
{
if(i<res)
{
var2 = tmp[i].getElementsByTagName("span")[0].getElementsByClassName("inverted")[0];
// alert(var2.innerHTML);
var evObj = document.createEvent('MouseEvents');
evObj.initEvent( 'mouseover', true, false );
var2.dispatchEvent(evObj);
var2.style.backgroundColor="GREEN";
i++;
setTimeout(myfunc,3000);
}
};
setTimeout(myfunc,3000);
...