setTimeout方法执行一次

时间:2014-08-13 16:46:11

标签: javascript settimeout

当我单击checkBox时,该函数犹豫5秒,然后快速循环遍历$ .each跳过setTimeout方法。我假设setTimeout会在$ .each循环的每次传递中延迟5秒?我怎么能这样做?感谢

    checkBox.addEventListener('click', function() {
            var countLoop = 0;            
            $.each(placeObject, function(key,value) {
                setTimeout(function() {placesSearch(key,value);}, 5000);
                console.log("Loop :" + countLoop++);                
            });         
        }, 
        false);

3 个答案:

答案 0 :(得分:2)

setTimeout返回超时的ID,并立即返回。它将要在将来的设定时间执行的操作排队。但是,由于立即返回,它实际上不会暂停执行它所驻留的代码。

如果您希望暂停后运行$.each中的代码,则$.each中的所有代码都需要包含setTimeout

答案 1 :(得分:1)

检查此小提琴http://jsfiddle.net/6dzp1sj7/1/

checkBox.addEventListener('click', function() {
            var countLoop = 0;

            $.each(placeObject, function(key,value) {
                setTimeout(function() {
                    placesSearch(key,value);
                    console.log("Loop :" + countLoop++);
                }, (5000 * (key + 1)));           
            });         
        }, 
        false);

这里有一些JS KungFU: 这是小提琴 http://jsfiddle.net/6dzp1sj7/3/

        var placeObject = [0, 1, 2, 3, 4, 5];

        var countLoop = 0;         

        function tmp (key, value) {
                console.log(key);
                console.log(value);
                console.log("Loop :" + countLoop++);
        }

        var code = "";

        $.each(placeObject, function(key,value) {             
            var tmpl = "setTimeout(function() {tmp(" + key + ", " + value + ");__##__}, 1000);";

            if (key == 0) code = tmpl;

            if (key != 0) {
                code = code.replace('__##__', tmpl);
            }

            if (key == (placeObject.length - 1)) {
                code = code.replace('__##__', '');
                //console.log(code);
                eval(code);
            }                               
        });         

注意:切勿使用千斤顶只钻一个洞。

答案 2 :(得分:1)

如果你希望每个人在5秒内相互射击,即第一次迭代在5秒后激发,第二次迭代在10秒后激发,等等。然后你需要通过计数索引乘以每个单独超时的延迟。

var countLoop = 1;            
$.each(placeObject, function(key,value) {
  setTimeout(function() {placesSearch(key,value);}, 5000*countLoop);
  console.log("Loop :" + countLoop++);                
}); 

我已经创建了一个演示,演示了范围如何影响您使用console.log()打印的值。看一下这个小提琴的例子:

http://jsfiddle.net/smtryj6s/6/