2015-09-06 81 views
1

我通过串口(npm serialport模块)与控制器通信。Node.Js通过串口的异步任务

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

的通信是аsync(I发送的请求,并且有一个事件 “对的serialport( '数据')...” 接收到响应PROM控制器。

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

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

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

我如何设法响应每个请求的正确响应?

由于其自身的模块中的很多 阿维

回答

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();          
    }            
    });            
}             
+0

非常感谢,我会这样尝试 –