2013-02-26 38 views
2

我剛剛開始使用JavaScript,並且我仍然試圖讓我的腦海中圍繞它是如何工作的。Node.js函數,對象和變量

你能解釋爲什麼這工作

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'); 

我應該如何從我的串行端口的代碼中訪問我的socket對象(註釋線)?

感謝您與我的理解

回答

4

在你寫serialPort.on('data', received(data));,將立即調用received功能,並將結果傳遞給聽者on的第二個參數的第二個例子幫助。

取而代之,你只需要做serialPort.on('data', received);,它通過received函數本身,這意味着監聽器可以在準備好時調用它。

+0

謝謝,這有助於澄清事情。我發現很難理解JavaScript是如何來自「傳統」C#背景的 – 2013-02-26 16:00:10

+0

只要始終牢記,「一切都是對象」,可以將它分配給變量,甚至函數。它會全部落入:) – Graham 2013-02-26 16:11:41

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客戶端。

+0

我想在我的串口收到數據時向我的客戶端發送數據,所以看起來我需要一個由serialport.on調用的函數('data',收到但通過套接字??我確定我仍然看着這個錯誤的方式? – 2013-02-26 16:04:45