2013-12-22 51 views
2

我正在写一个Node.js服务器,该服务器监视充满空文件的目录以进行更改。当文件改变时,它会通知客户端,然后清空文件。手表代码是:在Node.js中观看文件

fs.watch("./files/", function(event, targetfile){ 
     console.log(targetfile, 'is', event) 
     fs.readFile("./files/"+targetfile, 'utf8', function (err,data) { 
       if (err) { 
         return console.log(err); 
       } 
       if (data=="") return; //This should keep it from happening 
       //Updates the client here 
       fs.truncate("./files/"+targetfile, 0); 
     }); 
}); 

更改事件发生两次,因此客户端更新两次。这不可能发生。它就像watch函数被同时调用两次,并且两者都可以在执行truncate命令之前执行。我如何避免这种情况发生?我不能说,阻止一个线程,因为我需要它实时响应其他文件。

谢谢你的帮助。我是Node.js的新手,但到目前为止我很喜欢它。

+1

第二个事件是由您截断文件触发的...... – Darkhogg

+0

这不是因为它使用数据更新客户端两次。 –

回答

2

您可以使用下划线实用程序方法Once来保持函数不止一次执行。你必须让你的代码看起来是这样的:

var func = _.once(function(targetfile){ 
    fs.readFile("./files/"+targetfile, 'utf8', function (err,data) { 
     if (err) { 
       return console.log(err); 
     } 
     if (data=="") return; //This should keep it from happening 
     //Updates the client here 
     fs.truncate("./files/"+targetfile, 0); 
    }); 
}); 
fs.watch("./files/", function(event, targetfile){ 
    console.log(targetfile, 'is', event); 
    func(targetfile); 
}); 

如果你想它多次执行,但你要过滤掉重复的事件,你可以使用函数,如throttledebounce

+0

油门看起来像我想要的...我会尝试一下,如果它有效,我会接受答案。 –

+0

我错了。 “debounce”是我想要的。但它的工作。谢谢! –

+0

很高兴能帮到你! – gcochard