我想要一段代码重复100次,中间有1秒的延迟。这是我的代码:
for(var i = 0; i < 100; i++){
setTimeout(function(){
//do stuff
},1000);
}
虽然这对我来说似乎不对,但事实并非如此。它不是运行“做东西”100次,而是在它之间等待1秒,而是等待1秒,然后毫不拖延地运行“做东西”100次。
有人对此有任何想法吗?
答案 0 :(得分:2)
您可以使用setInterval()
完成此操作。
只要将clearTimeout
调用到存储它的变量timer
,它就会调用我们选择的函数。
请参阅下面的示例以及评论:(并记得打开您的开发者控制台(在chrome右键单击 - &gt; inspect element - &gt;控制台中)以查看 console.log )。
// Total count we have called doStuff()
var count = 0;
/**
* Method for calling doStuff() 100 times
*
*/
var timer = setInterval(function() {
// If count increased by one is smaller than 100, keep running and return
if(count++ < 100) {
return doStuff();
}
// mission complete, clear timeout
clearTimeout(timer);
}, 1000); // One second in milliseconds
/**
* Method for doing stuff
*
*/
function doStuff() {
console.log("doing stuff");
}
此处还有: jsfiddle example
作为奖励:您的原始方法无法正常工作,因为您基本上尽可能快地分配了100个setTimeout调用。因此,而不是他们运行一秒钟的差距。它们将以for循环将它们置于队列中的速度运行,在1000毫秒的当前时间之后开始。
例如,以下代码显示了使用方法时的时间戳:
for(var i = 0; i < 100; i++){
setTimeout(function(){
// Current time in milliseconds
console.log(new Date().getTime());
},1000);
}
它会输出类似(毫秒)的内容:
1404911593267 (14 times called with this timestamp...)
1404911593268 (10 times called with this timestamp...)
1404911593269 (12 times called with this timestamp...)
1404911593270 (15 times called with this timestamp...)
1404911593271 (12 times called with this timestamp...)
您还可以在 js fiddle
中看到此行为答案 1 :(得分:0)
您需要使用回调,node.js是异步的:
function call_1000times(callback) {
var i = 0,
function do_stuff() {
//do stuff
if (i < 1000) {
i = i + 1;
do_stuff();
} else {
callback(list);
}
}
do_stuff();
}
或者,更清洁:
setInterval(function () {
//do stuff
}, 1000);
答案 2 :(得分:0)
现在您已经意识到for
循环在几毫秒内迭代,另一种方法是根据计数简单地调整setTimeout
延迟。
for(var i = 0; i < 100; i++){
setTimeout(function(){
//do stuff
}, i * 1000);
}
对于许多用例,这可能被视为糟糕。但是在特殊情况下你知道你肯定想在 y 秒数之后运行代码 x ,这可能很有用。
答案 3 :(得分:0)
我更喜欢递归函数。首先以counter
= 0的值调用该函数,然后在该函数中检查counter
小于100。如果是,则执行您的任务,然后再调用setTimeout并再次调用{ {1}},但值为doStuff
。该函数将精确运行100次,每秒一次,然后退出:
counter + 1