[英]Data Stream and Promises Node.js with serialport
我正在研究一个利用串行端口与微控制器通信的nodejs项目。 我可以使用Serialport使所有功能正常工作,但是我正在努力确定处理接收数据的最佳方法。
这是我正在测试的基本程序:
const serialPort = require('serialport');
const delimiter = require('@serialport/parser-delimiter')
const readline = require('readline');
const EventEmitter = require('events');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.setPrompt('> ');
rl.prompt();
const uart = new serialPort('path-to-port', {
baudRate: 9600
});
const parser = uart.pipe(new delimiter({ delimiter: '\n'}));
const event = new EventEmitter();
parser.on('data', (data) => {
event.emit('dataReady', data);
});
rl.on('line', (input) => {
if(input === 'close'){
console.log('Bye');
process.exit();
}
uart.write(input + '\n', (err) => {
if (err) {
console.log('uart write error');
}
});
console.log('Waiting on data...');
readAsync().then((data) => {
console.log(' ->', data.toString());
rl.prompt();
});
});
const readAsync = () => {
const promise = new Promise((resolve, reject) => {
event.once('dataReady', (data) => {
resolve(data);
});
});
return promise;
}
我想返回一个承诺,一旦收到数据,该承诺就会兑现。 目前,我正在发出一个事件,并使用侦听器来实现承诺。 这是最好的方法还是有更好的选择?
更新
我计划导出一个写入串口的函数,一旦接收到数据,该函数即会兑现承诺。
例:
module.exports.write = (cmd) => {
uart.write(input + '\n', (err) => {
if (err) {
console.log('uart write error');
}
});
return readAsync();
}
对于流式传输任意数量数据的事物(即, parser
对象可能具有许多data
事件),您可能不想使用promise。 诺言一旦解决,便readAsync
解决(即,您只能将数据放入其中一次-通过设置readAsync
的方式就可以知道)。 您可能想尝试一种称为Observable的方法。 您可以将可观察对象连接到有问题的流,它将把它们排成队列以便以后进行转换或使用(您可以将其视为可以接受多个数据项的承诺)。 这是一个很好的SO答案,它说明了流(当前正在使用的)和可观察变量如何互操作以实现更大的编程灵活性。
不幸的是,Node.js没有内置的Observable实用程序,但是有一个经过实践检验的规范解决方案RxJS 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.