Node.js中使用计时器定时执行函数详解_node.js(4)
fs.unlink("/path/to/file");
});
});
使用setTimeout替代setInterval来确保函数执行的串行性
假设,你打算设计一个叫my_async_function的函数,它可以做某些I/O操作(比如解析日志文件)的函数,并打算让它周期性执行,你可以用setInterval这样实现它:
var interval = 1000;
setInterval(function() {
my_async_function(function() {
console.log('my_async_function finished!');
});
},interval);//译者注:前面“,interval”是我添加的,作者应该是笔误遗漏了
你必须能确保这些函数不会被同时执行,但是如果使用setinterval你无法保证这一点,假如my_async_function函数运行的时间比interval变量多了一毫秒,它们就会被同时执行,而不是按次序串行执行。
译者注:(下面粗体部分为译者添加,非原书内容)
为了方便理解这部分内容,可以修改下作者的代码,让它可以实际运行:
var interval = 1000;
setInterval(function(){
(function my_async_function(){
setTimeout(function(){
console.log("1");
},5000);
})();
},interval);
运行下这段代码看看,你会发现,等待5秒钟后,“hello ”被每隔1秒输出一次。而我们期望是,当前my_async_function执行完毕(耗费5秒)后,等待1秒再执行下一个my_async_function,每次输出之间应该间隔6秒才对。造成这种结果,是因为my_async_function不是串行执行的,而是多个在同时运行。
因此,你需要一种办法来强制使一个my_async_function执行结束到下个my_async_function开始执行之间的间隔时间正好是interval变量指定的时间。你可以这样做:
var interval = 1000; // 1 秒
(function schedule() { //第3行
setTimeout(function do_it() {