2

私は自分の疑いを確認したかっただけです。

次の方法でSocket.ioを使用することを推奨する記事に出くわしました。

var app = require('express').createServer()
var io = require('socket.io').listen(app);

app.listen(8080);

// Some unrelated stuff

io.sockets.on('connection', function (socket) {
    socket.on('action1', function (data) {
        // logic for action1
    });

    socket.on('action2', function (data) {
        // logic for action2
    });

    socket.on('disconnect', function(){
        // logic for disconnect
    });
});

以下の方がリソースをより有効に活用できると思います。

var app = require('express').createServer()
var io = require('socket.io').listen(app);

app.listen(8080);

// Some unrelated stuff

io.sockets.on('connection', function (socket) {
    socket.on('action1', action1);
    socket.on('action2', action2);
    socket.on('disconnect', disconnect);
});

function action1(data) {
    // logic for action1
}

function action2(data) {
    // logic for action2
}

function disconnect() {
    // logic for disconnect
}

イベントを処理する無名関数connectionはメモリ内に1回だけ作成されますが、、、を処理する無名関数は、action1ソケット接続ごとにメモリ内に作成されるaction2と思います。disconnect2番目のアプローチの問題はsocket、範囲がなくなったことです。

それで、最初に、関数の作成についての私の疑いは本当ですか?そして第二に、もしそうならsocket、名前付き関数のスコープに入る方法はありますか?

4

2 に答える 2

5

クロージャーを使用すると、スコープをクリーンに保つことができます。

io.sockets.on('connection', function () {
    function action1(data) {
        // logic for action1
    }
    function action2(data) {
        // logic for action2
    }
    function disconnect() {
        // logic for disconnect
    }
    return function (socket) {
        socket.on('action1', action1);
        socket.on('action2', action2);
        socket.on('disconnect', disconnect);
    }
}()); // <- note the immediate function call 

あなたの質問に:

まず、関数の作成に関する私の疑いは本当ですか?

はい。上記のクロージャー アプローチはこれを防ぎ、コールバック関数は 1 回だけ作成されます。さらに、すべてが正しい親スコープを参照します。

第二に、もしそうならsocket、名前付き関数のスコープに入る方法はありますか?

は、コールバックsocketと同様に利用できます。this

于 2012-04-14T20:38:28.637 に答える
1

おっしゃる通り、接続ごとに匿名メソッドが作成されます。スコープが必要ない場合は、2 番目のメソッドがそれを回避します。ソケットスコープが必要な場合、それを回避する実際の方法はありません。メソッドを(何らかの理由で)外部に保持し、スコープを保持したい場合は、いつでも次のことができます。

//...
socket.on('action1', function(){
  action1.apply( socket, arguments );
} );
//... and so forth.

しかし、それでは接続ごとにメソッド シグネチャを作成する必要があるため、何を得られるかわかりません。

于 2012-04-14T20:30:05.283 に答える