Node.Jsasynchronous任务通过串口

我正在通过串口(npm serialport模块)与控制器进行通信。

控制器通过它们的ID来处理多个元素。

通信是аsync(我发送了一个请求,并有一个事件“serialport .on('data')…”,收到响应prom控制器。

我有一个Web API(GET),接收一个ID并发送一个请求到控制器接收具有给定ID的元素的状态。

问题是,当API需要响应,我还没有收到控制器的数据。

我还需要通过API一次支持多个请求。

我如何设法以正确的回应来响应每一个请求?

非常感谢Avi

将控制器代码放在自己的模块中,并使用一个命令队列。 当你拉下一个命令使“当前命令”。 每个命令都有一个process()函数,用于处理来自串口的数据,并返回一个值,表示它是否需要更多的数据或已经完成。 如果一个命令完成,然后拉下一个命令。

每个命令都有一个callback函数,当它完成时调用它,可以用来返回asynchronous响应。

以下是未经testing的轮廓(ES6):

// controller.js var cmds = [], currentCmd = null; var stream = null; class ControllerCommand { constructor(strm) { this.stream = strm;} send(data) {this.stream.write(data);} } class StatusCmd extends ControllerCmd { constructor(stream, id, cb) { super(stream) this.id = id; this.cb = cb } exec() { this.send(`STATUS ${id}`);} parse(resp) { this.status = resp; this.cb(this.status); return true; } } function next() { if (cmds.length > 0) { currentCmd = cmds.shift(); cmd.exec(); } } function add(cmd) { cmds.push(cmd); if (cmds.length == 1) next(); } export function status(id, cb) { add(new StatusCmd(stream, id, cb)); } export function init(str) { stream = str; stream.on('data', (data) => { if (currentCmd.parse(data.toString())) { next(); } }); }