我通过以下方式观看文件:
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连接块中将虚拟发射器功能换成了一个真正的发射器功能。
尽管有些令人费解,但到目前为止,它仍然有效。当文件内容更改时,我会向客户端获取实时恒定流。
我的问题是:我无法捕获文件内容不再更改的事件。我需要能够捕捉到这一点,并让客户端知道文件不再更改。
解决这个问题的最佳方法是什么?
答案 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
函数(您需要实现)。