我是第一次处理这个问题,所以到目前为止所有的答案都可能比我的解决方案更好,但是它们都不是 100% 适合我的情况,所以我想出了一些稍微不同的东西——我使用 XOR 操作翻转 0 和 1 之间的整数,有效地跟踪和忽略文件上的每一秒事件:
var targetFile = "./watchThis.txt";
var flippyBit = 0;
fs.watch(targetFile, {persistent: true}, function(event, filename) {
if (event == 'change'){
if (!flippyBit) {
var data = fs.readFile(targetFile, "utf8", function(error, data) {
gotUpdate(data);
})
} else {
console.log("Doing nothing thanks to flippybit.");
}
flipBit(); // call flipBit() function
}
});
// Whatever we want to do when we see a change
function gotUpdate(data) {
console.log("Got some fresh data:");
console.log(data);
}
// Toggling this gives us the "every second update" functionality
function flipBit() {
flippyBit = flippyBit ^ 1;
}
我不想使用与时间相关的函数(如 jwymanm 的回答),因为我正在观看的文件可能会非常频繁地获得合法更新。而且我不想使用 Erik P 建议的观看文件列表,因为我只看一个文件。 Jan Święcki 的解决方案似乎有点矫枉过正,因为我正在低功耗环境中处理极短且简单的文件。最后,Bernado 的回答让我有点紧张——如果它在我处理完第一个更新之前到达,它只会忽略第二个更新,我无法处理那种不确定性。如果有人发现自己处于这种非常具体的场景中,那么我使用的方法可能有一些优点吗?如果它有什么大问题,请让我知道/编辑这个答案,但到目前为止它似乎运作良好?
注意:显然,这强烈假设每次实际更改您将获得 2 个事件。显然,我仔细测试了这个假设,并了解了它的局限性。到目前为止,我已经确认:
- 在 Atom 编辑器中修改文件并保存触发器 2 更新
-
touch 触发 2 次更新
- 通过
> 的输出重定向(覆盖文件内容)触发2 次更新
-
通过
>> 追加有时会触发 1 次更新!*
我可以为不同的行为想出完美的理由,但我们不需要知道为什么会发生某些事情来计划它 - 我只是想强调你会想要检查在你自己的环境和你自己的用例的上下文中为你自己(duh),不要相信互联网上自认的白痴。话虽这么说,但采取了预防措施,到目前为止我还没有任何奇怪的事情。
* 全面披露,我实际上不知道为什么会发生这种情况,但我们已经在使用 watch() 函数处理不可预测的行为,那么还有什么不确定性呢?对于在家跟随的任何人,更快速地附加到文件似乎会导致它停止双重更新,但老实说,我真的不知道,而且我对这个解决方案在实际情况下的行为感到满意它会使用,这是一个单行文件,最快每秒会更新(内容替换)两次。