fs.watch事件和网络套接字,捕获“不变”情况

时间:2018-11-04 01:58:39

标签: javascript node.js websocket fs

我通过以下方式观看文件:

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);
};

我这样做是因为后来我将该功能注入到websocket调用中:

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 :(得分:1)

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函数(您需要实现)。