javascript - node.js 等待可变长度数组类型的事件

标签 javascript arrays node.js websocket socket.io

所以我正在编写一个小型应用程序,它将串行端口公开给 Web 服务。

允许客户端打开端口,服务器跟踪打开的端口。

我是 javascript 的新手,因此还请指出您在我的代码中看到的任何其他错误!

无论如何,我有 websockets 在客户端和服务器之间传递消息。

有一个 ser_con 事件指示服务器打开与串行端口的新连接。这还将串行端口对象附加到数组中,以便我稍后可以引用它。

var ser = []
...
socket.on('ser_con', function(d) {
  console.log('connect event')
  sp = new SerialPort.SerialPort(d.name, {
    baudrate: d.baudrate,
    databits: d.databits,
    stopbits: d.stopbits,
    parity: d.parity,
    buffersize: d.buffersize,
    parser: SerialPort.parsers.raw
  },false);
  sp.open(function (err) {
    if (err) {
      console.log('Error connecting to port: ' + d.name + ', error: ' + err);
      socket.emit('ser_err', 'Error connecting to port: ' + d.name + ', error: ' + err);
    } else {
      console.log('connected to serial port ' + d.name);
      data = {
        name: d.name,
        b:'connected to serial port ' + d.name + '\n'
      }
      socket.emit('data', data);
      ser.push({'name':d.name,'sp':sp})
    }
  })
});

因此,一旦连接成功,我会将端口名称和串行端口对象的实例附加到 ser 数组中。

我遇到的问题是如何监听所有串行端口实例上的事件

我尝试这样做,但它不起作用,我认为这是不允许的,因为 for 循环本身不是一个事件。我不知道如何解决这个问题,因为......

for (var i=0; i < ser.length; i++){
  ser[i].sp.on('data', function(d) {
    console.log('recieved data on port ' + ser[i].name)
    data = {
      name: ser[i].name,
      b: d
    }
    socket.emit('data', data);
  });
}

感谢任何帮助。

最佳答案

您在回调中使用迭代器变量。这是common javascript mistake 。要解决此问题:

for (var j=0; j < ser.length; j++){
  (function(i){
    ser[i].sp.on('data', function(d) {
        console.log('recieved data on port ' + ser[i].name)
        data = {
          name: ser[i].name,
          b: d
        }
        socket.emit('data', data);
      });
  }(j))  
}

我不知道你在代码中的哪个位置运行这个 for 循环。但如果您没有正确处理这个问题,您可能最终会将多个回调绑定(bind)到同一个串行端口对象。我建议在打开端口后绑定(bind)事件:

...
sp.open(function (err) {
    if (err) {
      console.log('Error connecting to port: ' + d.name + ', error: ' + err);
      socket.emit('ser_err', 'Error connecting to port: ' + d.name + ', error: ' + err);
    } else {
      console.log('connected to serial port ' + d.name);
      data = {
        name: d.name,
        b:'connected to serial port ' + d.name + '\n'
      }
      socket.emit('data', data);
      ser.push({'name':d.name,'sp':sp})

      //listen 'data' event here
      //you have access to both 'd' and 'socket' variable here
      sp.on('data', function(data) {
        console.log('recieved data on port ' + d.name)
        data = {
          name: d.name,
          b: data
        }
        socket.emit('data', data);
      });
    }
})

关于javascript - node.js 等待可变长度数组类型的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31106831/

相关文章:

arrays - 如何有效地处理数组中的多次插入?

java - 如何根据值按升序排列数组列表

node.js - 如何使用 async/await 和 Promise 响应?

javascript - 如何根据字符串输入更新一个Mongo文档Node.js?

javascript - 对两个图像使用一个函数

javascript - 如何解耦类中的嵌套对象函数

php - 如何制作一个只有 1 个索引的数组到顶层?

javascript - Chrome - 奇怪的显示问题。 Ajax 请求

javascript - AngularJS异步请求方法服务使用promise返回数据

node.js - npm - 如何覆盖依赖包的依赖项?