Наблюдение за файлами в узле.JS


Я пишу узел.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 вызывается дважды в одно и то же время, и оба они выполняются до того, как любой из них может получить команду усечения. Как мне не допустить этого? Я не могу, скажем, блокировать поток, потому что мне нужно он будет реагировать в режиме реального времени для других файлов.

Спасибо за помощь. Я новичок в ноде.JS, но до сих пор я люблю его.

1 2

1 ответ:

Вы можете использовать служебный метод подчеркивания один раз, который удерживает функцию от выполнения более одного раза. Вам придется сделать свой код похожим на это:

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

Если вы хотите, чтобы он выполнялся более одного раза, но вы хотите отфильтровать повторяющиеся события, вы можете использовать такую функцию, как дроссель или debounce.