node.js 等待可变长度数组类型的事件
node.js wait for events on variable length array type
所以我正在编写一个将串行端口公开给 Web 服务的小应用程序。
允许客户端打开端口,服务器会跟踪打开的端口。
我是 javascript 的新手,所以还请指出您在我的代码中看到的任何其他错误!
无论如何,我有 websockets 在客户端和服务器之间传递消息。
有一个 ser_con
事件指示服务器打开到串行端口的新连接。这还将 serialport 对象附加到一个数组,以便我稍后可以引用它。
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 循环。但是如果你没有正确处理这个问题,你最终可能会将多个回调绑定到同一个串行端口对象。我建议在打开端口后绑定事件:
...
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);
});
}
})
所以我正在编写一个将串行端口公开给 Web 服务的小应用程序。
允许客户端打开端口,服务器会跟踪打开的端口。
我是 javascript 的新手,所以还请指出您在我的代码中看到的任何其他错误!
无论如何,我有 websockets 在客户端和服务器之间传递消息。
有一个 ser_con
事件指示服务器打开到串行端口的新连接。这还将 serialport 对象附加到一个数组,以便我稍后可以引用它。
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 循环。但是如果你没有正确处理这个问题,你最终可能会将多个回调绑定到同一个串行端口对象。我建议在打开端口后绑定事件:
...
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);
});
}
})