数据流和Promise Node.js与serialport

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据流和Promise Node.js与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: '
'}));

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 + '
', (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;
}

我想回复一旦收到数据就会履行的承诺。目前我正在发布一个事件并使用一个监听器来履行承诺。这是最好的方法还是有更好的选择?

UPDATE

我计划导出一个函数,用于写入一旦接收到数据就履行承诺的串行端口。

例:

module.exports.write = (cmd) => {
  uart.write(input + '
', (err) => {
    if (err) {
      console.log('uart write error');
    }
  });
  return readAsync();
}
答案

对于流式传输任意数量数据的内容(即,parser对象可能有许多data事件),您可能不希望使用promise。一旦一个承诺得到解决,它就会得到很好的解决(也就是说,你只能将数据放入其中一次 - 看起来就像你设置的readAsync一样)。你可能想要尝试一种名为Observable的东西。您可以将observable连接到相关的流,它会将它们排队等待以后进行转换或使用(您可以将其视为可以接受多个数据项的承诺)。这是一个good SO answer,解释了流(你目前使用的是什么)和observables可以互操作以获得更多的程序化灵活性。

不幸的是,Node.js没有内置的Observable实用程序,但有一个经典且经过实战考验的解决方案RxJS

以上是关于数据流和Promise Node.js与serialport的主要内容,如果未能解决你的问题,请参考以下文章

带有 API 和数据库查询的 Node.js Promise Chain

如何在 node.js 中将函数与 Promise 同步

Node.js 中的 Promise 和数组

Node.js 和 Telegraf TimeoutError: Promise 在 90000 毫秒后超时

在 Node.js 中用 Promise 替换回调

Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。