2013-12-22 3 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); 
     }); 
}); 

Событие изменения происходит дважды, поэтому клиент дважды обновляется. Этого не может быть. Его, как функция часов, вызывается дважды в одно и то же время, и оба выполняются до того, как либо смогут перейти к команде truncate. Как мне это избежать? Я не могу, скажем, заблокировать поток, потому что мне нужно, чтобы он реагировал в реальном времени на другие файлы.

Благодарим за помощь. Я новичок в Node.js, но до сих пор мне это нравится.

+1

Второе событие запускается вами, обрезая файл ... – Darkhogg

+0

Это не потому, что он дважды обновляет клиент данными. –

ответ

2

Вы можете использовать метод утилиты underscore 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); 
}); 

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

+0

Дроссель выглядит так, как я хочу ... Я попробую, и если это сработает, я приму ответ. –

+0

Я был неправ. 'debounce' - это то, что я хотел. Но это сработало. Спасибо! –

+0

Рад, что я мог помочь! – gcochard

Смежные вопросы