2015-09-06 87 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

非常感謝,我會這樣嘗試 –