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

更改事件發生兩次,因此客戶端更新兩次。這不可能發生。它就像watch函數被同時調用兩次,並且兩者都可以在執行truncate命令之前執行。我如何避免這種情況發生?我不能說,阻止一個線程,因爲我需要它實時響應其他文件。

謝謝你的幫助。我是Node.js的新手,但到目前爲止我很喜歡它。

+1

第二個事件是由您截斷文件觸發的...... – Darkhogg

+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

+0

油門看起來像我想要的...我會嘗試一下,如果它有效,我會接受答案。 –

+0

我錯了。 「debounce」是我想要的。但它的工作。謝謝! –

+0

很高興能幫到你! – gcochard