当我单击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);
答案 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()
打印的值。看一下这个小提琴的例子: