Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过串行端口执行Node.Js异步任务_Javascript_Node.js - Fatal编程技术网

Javascript 通过串行端口执行Node.Js异步任务

Javascript 通过串行端口执行Node.Js异步任务,javascript,node.js,Javascript,Node.js,我通过串口(npm串口模块)与控制器通信 控制器通过其id处理多个元素 通信是同步的(我发送了一个请求,并且有一个事件“serialport.on('data')…”接收到控制器的响应 我有一个web API(GET),它接收一个id并向控制器发送一个请求,以接收具有给定id的元素的状态 问题是,当API需要响应时,我还没有收到来自控制器的数据 我还需要通过API一次支持多个请求 如何以正确的响应来响应每个请求 非常感谢 Avi将控制器代码放在自己的模块中,并使用命令队列。在拉取下一个命令时,使

我通过串口(npm串口模块)与控制器通信

控制器通过其id处理多个元素

通信是同步的(我发送了一个请求,并且有一个事件“serialport.on('data')…”接收到控制器的响应

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

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

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

如何以正确的响应来响应每个请求

非常感谢
Avi

将控制器代码放在自己的模块中,并使用命令队列。在拉取下一个命令时,使其成为“当前命令”。每个命令都有一个进程()函数,该函数处理来自串行端口的数据并返回一个值,该值指示它是否需要更多数据或是否已完成。如果命令完成,则拉入下一个命令

每个命令都有一个回调,它在完成时调用,您可以使用该回调返回异步响应

以下是未经测试的大纲(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();                                    
    }                                            
  });                                            
}