我正通过串口(npm serialport module)与控制器通信。
控制器按其ID处理多个元素。
通信是同步的(我发送了一个请求,并且有一个事件“serialport .on('data')...”收到了控制器的响应。
我有一个Web API(GET),它接收一个id并向控制器发送请求以接收具有给定id的元素的状态。
问题是当API需要响应时,我还没有收到控制器的数据。
我还需要通过API一次支持多个请求。
如何通过正确的响应来管理每个请求?
非常感谢 阿维
答案 0 :(得分:1)
将控制器代码放在自己的模块中并使用命令队列。当你拉下一个命令时,将其作为'当前命令'。每个命令都有一个process()函数,用于处理来自串行端口的数据,并返回一个值,指示是否需要更多数据或已完成。如果命令完成,则拉下一个命令。
每个命令都有一个回调,它在完成后调用,可用于返回异步响应。
以下是未经测试的大纲(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();
}
});
}