setTimeout是非阻塞的,它是异步的。你给它一个回调,当延迟结束时,你的回调被调用。
以下是一些实现:
使用递归
您可以在回调中使用递归调用。setTimeout
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
清除调用堆栈(请参阅此问题),因此您不必担心setTimeout
递归调用的堆栈溢出。
使用生成器(io.js,ES6)
如果您已经在使用io.js (使用ES6的“下一个”Node.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);
});
顺便说一句:这实际上是在使用循环;)
生成器函数文档。