События fs.watch и websockets, ловящие ситуации "без изменений" - PullRequest
0 голосов
/ 04 ноября 2018

Я смотрю файл с:

fs.watch('./data/object.json', (eventType, filename) => {})
    if (`${eventType}` === 'change'){
        // I call my emission function.
        emission(/* passing the contents of the file here */);
    })

Вот что такое функция излучения:

// Just a dummy place-holder function.
// We later replace that with the real function inside the websocket
// block.
var emitter = function() {};

// Define a hook for the emission point.¬
// 'input' is the bit that receives the contents of the file.
var emission = function(input) {
    emitter(input);
};

Я делаю это, потому что позже внедряю функцию в вызов веб-сокета:

wss.on('connection', function(ws) {
    emitter = function(input){
        // This receives the contents of the file through the input.
        // Do some more stuff, convert 'input' into 'data'...
        // ... and send to the client.
        wss.clients.forEach(function(client) {
            client.send(data);
        }
    }
});

Поэтому я заменяю фиктивную функцию эмиттера на реальную, пока она находится внутри блока подключения к websocket.

Хотя это немного запутанно, пока это работает. Я получаю постоянный поток в реальном времени для клиента при изменении содержимого файла.

Моя проблема: я не могу поймать событие, когда содержимое файла больше не меняется. Я должен быть в состоянии уловить это и сообщить клиенту, что файл больше не меняется.

Каков наилучший способ решить эту проблему?

1 Ответ

0 голосов
/ 05 ноября 2018

В обратном вызове fs.watch просто создайте таймер, чтобы периодически проверять, изменяется ли файл.

var changing = false;
var timer = null; 

function checkChanging() {
    if (!changing) {
      clearInterval(timer);
      timer = null;

      notifyNoChange();
    }
    changing = false;
}

fs.watch('./data/object.json', (eventType, filename) => {})
    if (`${eventType}` === 'change'){
        if (!timer ) {
            timer = setInterval(checkChanging, 1000);
        }

        changing = true;

        // I call my emission function.
        emission(/* passing the contents of the file here */);
    })

Таймер устанавливается при первом изменении файла. Вам может потребоваться рефакторинг этого кода, если вы хотите справиться с ситуацией, когда файл вообще не начинает меняться. Функция checkChanging проверит, произошло ли изменение файла в течение последней секунды, и вызовет функцию notifyNoChange (которую необходимо реализовать).

...