認沽控制器代碼和使用的命令隊列。當你拉下一個命令時,使'當前命令'。每個命令都有一個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();
}
});
}
非常感謝,我會這樣嘗試 –