Node.js函数,对象和变量

时间:2013-02-26 13:32:27

标签: javascript node.js function socket.io anonymous-function

我刚刚开始使用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');

我应该如何从我的串口代码(注释掉的行)中访问我的套接字对象?

感谢您帮助我理解

2 个答案:

答案 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客户端。