setTimeout с шаблоном раскрытия модуля - PullRequest
4 голосов
/ 13 января 2012

In Выявление шаблона модуля JavaScript, как использовать функцию setTimeout?

Вот пример .

HTML: <div id="container1"></div>

JavaScript:

var classA = (function() {
    var i = 0;
    var names = ["a", "b", "c", "d", "e", "f"];
    var callTest = function() {
        for (var n in names) {
            window.setTimeout(function() {
                callTest2(names[n]);
            }, 1000);
        }
    };

    var callTest2 = function(pName) {
        $("#container1").append("In callTest   " + i+++" " + pName + "<br>");
        window.setTimeout(function() {
            callTest2(pName)
        }, 10000)
    };

    return {
        testTheTest: function() {
            callTest();
        }
    }
})();

classA.testTheTest();

Framework: jQuery 1.5.2

Когда я выполняю вывод, это:

In callTest 0 f
In callTest 1 f
In callTest 2 f
In callTest 3 f
In callTest 4 f
In callTest 5 f

Вместо:

In callTest 0 a
In callTest 1 b
In callTest 2 c
In callTest 3 d
In callTest 4 e
In callTest 5 f

Чего мне не хватает?Где я делаю не так?

Ответы [ 3 ]

2 голосов
/ 13 января 2012

вызывает понимание функции setTimeout не в этом месте, а через 1сек.И когда он называется, n равен последнему индексу.Вы должны сделать n глобальным и увеличивать каждый раз, когда вызывается функция

var classA = (function() {
    var i = 0;
    var names = ["a", "b", "c", "d", "e", "f"];
    var n = 0;
    var callTest = function() {
        for (var i in names) {
            window.setTimeout(function() {
                callTest2(names[n]);
                n++;
            }, 1000);
        }
    };

    var callTest2 = function(pName) {
        $("#container1").append("In callTest   " + i+++" " + pName + "<br>");
        window.setTimeout(function() {
            callTest2(pName)
        }, 10000)
    };

    return {
        testTheTest: function() {
            callTest();
        }
    }
})();

classA.testTheTest();
2 голосов
/ 13 января 2012

Я сделал несколько небольших изменений в вашем коде, что означает, что теперь он работает так, как вы хотите:

var classA = (function() {
    var i = 0,
        names = ["a", "b", "c", "d", "e", "f"],
        namesLength = names.length,
        callTest = function() {
            window.setTimeout(function() {
                callTest2(0);
            }, 1000);
        },
        callTest2 = function(pIndex) {
            if (pIndex < namesLength) {
                var name = names[pIndex++];
                $("#container1").append("In callTest   " + i+++" " + name + "<br>");
                window.setTimeout(function() {
                    callTest2(pIndex);
                }, 1000);
            }
        };

    return {
        testTheTest: function() {
            callTest();
        }
    }
})();

classA.testTheTest();

Вот рабочий пример .

1 голос
/ 13 января 2012
   for (var n in names) {
            window.setTimeout(function() {                
                callTest2(names[n]);
            }, 1000);
        }

Код выше эквивалентен приведенному ниже коду.

    callTest2("f");
    callTest2("f");
    callTest2("f");
    callTest2("f");
    callTest2("f");
    callTest2("f");

Почему ..?Причина в том, что функция callTest2 () вызывается после завершения одной секунды, но перед этим массив всех names [] уже итерируется и последний символ "f" передается в функцию callTest2.

Цикл цикла начинается с очень малой доли микросекунды.т.е. массив names [] будет повторен за очень короткое время.В конце последний символ остается как «f», т.е. names [n].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...