我刚刚开始使用javascript,我仍然试图了解它是如何工作的。
你能解释为什么会这样吗
serialPort.on("open", function () {
console.log('open');
serialPort.on('data', function(data) {
console.log('data received: ' + data);
//socket.emit('test', { arduinotest: 'Arduino Connected'});
});
});
这不,我得到“数据未定义错误”
serialPort.on("open", function () {
console.log('open');
serialPort.on('data', received(data));
});
function received(data) {
console.log('data received: ' + data);
//socket.emit('test', { arduinotest: 'Arduino Connected'});
}
我应该如何分离我的功能,因为我不喜欢有很多嵌套函数?
这是我的整个代码
var app = require('express')()
, server = require('http').createServer(app)
, io = require('socket.io').listen(server)
, SerialPort = require('serialport').SerialPort;
//SERIAL
var portName = '/dev/ttyACM0';
var serialPort = new SerialPort(portName, {
baudRate: 115200,
dataBits: 8,
stopBits: 1,
parity: 'none',
});
serialPort.on("open", function () {
console.log('open');
serialPort.on('data', function(data) {
console.log('data received: ' + data);
//socket.emit('test', { arduinotest: 'Arduino Connected'});
});
});
//SERVER
app.get('/', function (req, res){
res.sendfile(__dirname + '/index.html');
});
io.sockets.on('connection', function (socket){
socket.emit('test', { servertest: 'Server Connected' });
socket.on('value', function (data){
switch(data.key)
{
case "Right":
if(data.state == "True")
{
serialPort.write("d180\n");
console.log("test RT");
}
else if(data.state == "False")
{
serialPort.write("d90\n");
console.log("test RF");
}
break;
case "Left":
if(data.state == "True")
{
serialPort.write("d0\n");
console.log("test LT");
}
else if(data.state == "False")
{
serialPort.write("d90\n");
console.log("test LF");
}
break;
case "Up":
if(data.state == "True")
{
serialPort.write("s0\n");
console.log("test UT");
}
else if(data.state == "False")
{
serialPort.write("s90\n");
console.log("test UF");
}
break;
case "Down":
if(data.state == "True")
{
serialPort.write("s180\n");
console.log("test DT");
}
else if(data.state == "False")
{
serialPort.write("s90\n");
console.log("test DF");
}
break;
}
});
});
server.listen(9081, '192.168.1.158');
我应该如何从我的串口代码(注释掉的行)中访问我的套接字对象?
感谢您帮助我理解
乔
答案 0 :(得分:4)
在第二个示例中,您编写了serialPort.on('data', received(data));
,它将立即调用received
函数,并将结果传递给on
侦听器的第二个参数。
相反,你只想做serialPort.on('data', received);
传递received
函数本身,这意味着听众可以在准备好时调用它。
答案 1 :(得分:2)
延长Graham's好的答案。通过简单地创建一个返回函数的函数,可以发送“接受参数”的回调。方法如下:
serialPort.on('data', received(data));
received = function(data){
return function(){
console.log(data);
}
}
对于您的其他问题:
我应该如何分离我的功能,因为我不喜欢有很多嵌套功能? 编写节点应用程序时有很多回调是正常的,这就是它的设计方式。只需将逻辑分为主要操作即可。例如,假设您要在数据库中保存某些内容:
function createBobAndSave(){
var bob - new Bob();
bob.save(function(err,savedBob){
console.log(savedBob.id)
});
}
我应该如何从我的串口代码(注释掉的行)中访问我的套接字对象? 因为socket不在客户端的套接字范围内。您仍然可以使用套接字对象将数据发送到所有socket.io客户端。