setTimeout是非阻塞,它是异步的。你给它一个回调,当延迟结束时,你的回调被调用。
下面是一些实现方法:
使用递归
可以在setTimeout
回调使用recursive call。
function waitAndDo(times) {
if(times < 1) {
return;
}
setTimeout(function() {
// Do something here
console.log('Doing a request');
waitAndDo(times-1);
}, 1000);
}
下面是如何使用您的功能:
waitAndDo(2000); // Do it 2000 times
关于堆栈溢出错误:setTimeout
明确调用堆栈(见this question),所以你不必担心在堆栈溢出setTimeout
递归调用。
使用生成器(io.js,ES6)
如果你已经在使用io.js( “下一个” 节点。
function* waitAndDo(times) {
for(var i=0; i<times; i++) {
// Sleep
yield function(callback) {
setTimeout(callback, 1000);
}
// Do something here
console.log('Doing a request');
}
}
下面是如何使用您的函数(co):
var co = require('co');
co(function*() {
yield waitAndDo(10);
});
BTW:使用ES6),你可以用优雅的解决方案解决您的问题,而递归JS这是真正使用循环;)
Generator functions documentation。
这很好。非常感谢。 – glasspill
欢迎。如果您对服务器的请求不是时间关键的,那么您最好使用一种结构,只有在先前的服务器调用完成后才启动新的定时器。然后,即使呼叫时间超过1秒(setTimeout计时器值),也只有一个服务器呼叫处于活动状态。 –
** WARNIG **:您的解决方案可能导致RangeError:超出最大呼叫堆栈大小。请参阅使用'setImmediate'的[此解决方案](http://stackoverflow.com/a/30575612/1480391)。 BTW OP正在使用Node.js ..(Node.js中没有'alert')。 –