我试图非常快速地从文件中读取数据(来自ADC的数据)。转换在打开文件时开始,并在关闭时完成。我需要等待再次打开文件,并等待当前转换完成。
我的问题是,当我快速打开文件时,nodejs不会捕获预期的事件。有什么线索解决这个问题吗?
node.on('input', function(){
readStream = fs.createReadStream(path.location,{encoding: 'utf8'});
if (readyFlag == 1) {
readStream.on('data',(data) => {
data = {payload: data/1000};
node.send(data);
console.log(`data: ${data}`);
})
}
readStream.on('open', () => {
console.log("file opened");
readyFlag = 0;
})
readStream.on('close', () => {
console.log("file closed");
readyFlag = 1;
})
readStream.on('error', (err) => {
console.log(err);
})
})
我总是打开文件。
答案 0 :(得分:0)
在我看来,这里的问题是readStream
的上下文-它不是input
回调的本地变量,这意味着每条消息都会覆盖对上一个流的引用。
当您增加消息的频率时,这开始失败的事实在我看来是合乎逻辑的,因为流还没有机会完成,所以readyFlag
永远不会重置。
针对此问题的解决方法实际上应该是一个衬里,将流设为本地变量
const readStream = ...
答案 1 :(得分:0)
我想我已经解决了。 readyFlag必须对输入范围是全局的,否则它将不起作用。我将if语句内的'open'事件移到了readyFlag的检查中。那似乎解决了问题。现在,系统不会挂起,只有在完成读取并关闭了先前打开的部分后,才打开文件。
这是代码:
var readyFlag = 1;
node.on('input', function(msg){
const readStream = fs.createReadStream(path.location,{encoding: 'utf8'});
if (readyFlag == 1) {
readStream.on('data',(data) => {
data = {payload: data/1000};
node.send(data);
console.log('data read');
readyFlag = 0;
})
readStream.on('open', () => {
console.log("file opened");
})
}
readStream.on('close', () => {
console.log("file closed");
readyFlag = 1;
})
readStream.on('error', (err) => {
console.log(err);
})
})