Я впервые сталкиваюсь с этой проблемой, поэтому все ответы на данный момент, вероятно, лучше, чем мое решение, однако ни один из них не подходил на 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), потому что файл, который я просматриваю, гипотетически может очень часто получать законные обновления. И я не хотел использовать список просматриваемых файлов, как предлагает Эрик П, потому что я просматриваю только один файл. Решение Яна Свенцкого показалось излишним, поскольку я работаю с очень короткими и простыми файлами в среде с низким энергопотреблением. Наконец, ответ Бернадо заставил меня немного понервничать — второе обновление будет игнорироваться только в том случае, если оно придет до того, как я закончу обработку первого, а я не могу справиться с такой неопределенностью. Если бы кто-то оказался в этом очень конкретном сценарии, может быть, в подходе, который я использовал, есть какая-то ценность? Если с этим что-то не так, пожалуйста, дайте мне знать / отредактируйте этот ответ, но пока он работает хорошо?
ПРИМЕЧАНИЕ. Очевидно, что это настоятельно предполагает, что вы получите ровно 2 события для каждого реального изменения. Очевидно, я тщательно проверил это предположение и узнал его ограничения. На данный момент я подтвердил, что:
- Изменение файла в редакторе Atom и сохранение запускает 2 обновления.
touch
запускает 2 обновления
- Перенаправление вывода через
>
(перезапись содержимого файла) вызывает 2 обновления
- Добавление через
>>
иногда вызывает 1 обновление!*
Я могу придумать вполне веские причины для различного поведения, но нам не нужно знать, почему что-то происходит, чтобы спланировать это — я просто хотел подчеркнуть, что вы захотите проверить это сами в вашей собственной среде и в контексте ваших собственных вариантов использования (дух), а не доверять самопровозглашенному идиоту в Интернете. При этом, с предпринятыми мерами предосторожности, у меня пока не было никаких странностей.
* Полное раскрытие, я на самом деле не знаю, почему это происходит, но мы уже имеем дело с непредсказуемым поведением функции watch(), так что еще немного неопределенности? Для тех, кто следит дома, более быстрое добавление к файлу, кажется, приводит к тому, что он прекращает двойное обновление, но, честно говоря, я действительно не знаю, и меня устраивает поведение этого решения в реальном случае. быть использован, который представляет собой однострочный файл, который будет обновляться (содержимое заменяется), как минимум, два раза в секунду.
person
Toadfish
schedule
26.09.2015