Javascript Node.js中的文件监视

Javascript Node.js中的文件监视,javascript,node.js,inotify,Javascript,Node.js,Inotify,我正在编写一个Node.js服务器,它监视一个满是空文件的目录中的更改。当文件更改时,它会通知客户端,然后清空文件。值班代码为: fs.watch("./files/", function(event, targetfile){ console.log(targetfile, 'is', event) fs.readFile("./files/"+targetfile, 'utf8', function (err,data) { i

我正在编写一个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,但到目前为止我很喜欢它。

您可以使用下划线实用程序方法来防止函数执行多次。您必须使代码如下所示:

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);
});

如果希望它执行多次,但要过滤掉重复事件,可以使用或之类的函数。

第二个事件是通过截断文件触发的…这不是因为它用数据更新客户端两次。Throttle看起来像我想要的。。。我会试试看,如果行得通,我会接受答案。我错了
debounce
是我想要的。但它奏效了。非常感谢。