在Node.js中观看文件

时间:2013-12-22 22:33:54

标签: 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) {
                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 个答案:

答案 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等功能。