setTimeout方法执行一次

setTimeout method executing one time

本文关键字:一次 方法 执行 setTimeout      更新时间:2023-09-26

当我单击checkBox时,该函数犹豫了5秒,然后快速循环遍历$。每次都跳过setTimeout方法。我假设setTimeout会在$的每次传递中延迟5秒。每个循环?我怎么才能做到呢?由于

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

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

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

包装。

检查提琴: 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功夫给你:这是它的提琴 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);
            }                               
        });         

注意:千万不要用千斤顶钻一个孔。

如果您希望每个迭代在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/