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