2

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

シリアル ポート コード (コメント アウトされた行) 内からソケット オブジェクトにアクセスするにはどうすればよいですか?

私の理解を助けてくれてありがとう

ジョー

4

2 に答える 2

4

2 番目の例では、すぐに関数serialPort.on('data', received(data));を呼び出し、結果をリスナーの 2 番目の引数に渡します。receivedon

serialPort.on('data', received);代わりに、関数自体を渡したいだけですreceived。つまり、リスナーは準備ができたらそれを呼び出すことができます。

于 2013-02-26T13:36:48.093 に答える
2

グラハムの良い答えを拡張します。関数を返す関数を作成するだけで、「パラメータを取る」コールバックを送信できます。方法は次のとおりです。

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

シリアル ポート コード (コメント アウトされた行) 内からソケット オブジェクトにアクセスするにはどうすればよいですか? クライアントのソケットスコープ内にソケットがないため、そうしません。sockets オブジェクトを使用して、すべての socket.io クライアントにデータを送信できます。

于 2013-02-26T14:27:33.273 に答える