7

Socket.ioの例はすべてこのパターンに従います

io.sockets.on("connection", function(mySocket){
    mySocket.on("my message", function(myData){
        ...
    });
});

これにより、接続ごとに新しいコールバック関数が作成されるように思われます。すべてのソケットが同じ方法でメッセージに応答すると仮定すると、次のようにすべてのソケットに対してハンドラーを1回定義する方がメモリ効率が高くなりません。

function myMessageHandler(data){
    ...
}

io.sockets.on("connection", function(mySocket){
    mySocket.on("my message", myMessageHandler);
});

またはこれさえ:

io.sockets.on("my message", function(mySocket, myData){
    ...
});

もしそうなら、なぜSocket.ioはメモリを浪費する方法を推奨するのでしょうか?「接続」コールバックのクロージャー内にソケットのステートフル変数を保持する必要がありますか?

4

2 に答える 2

0

別の観点から見ると、最初のフォームは読みやすいです(非常に多くの詳細が省略されているため)。このフォームは、ライブラリがどのように機能するかを最もよく示していると思います。同じ理由で、NodeのWebサイト自体でも同様のスタイルが使用されていると思います。そして、それがまさにそれらの場所で使用されている理由だと思います。

数分後、ブログやディスカッションを読んだ後、開発者は通常、名前付き関数を渡すことを選択していることがわかります。パフォーマンスが向上すると確信していますが、主な動機は間違いなく読みやすさです。2番目のフォーム(またはより引き出されたフォーム)は、関数が大きくなるにつれて操作しやすくなると思います。

于 2012-08-02T04:29:34.160 に答える
0

最も効率的な方法でSocket.ioを定義する:

   io.on('connection', function (socket) {
   socket.on('new-message', function (data) {
       io.emit('emit-message', data)
        });
   });

または

   io.on('connection', (socket) => {
   console.log('user connected');

   socket.on('disconnect', () => {
       console.log('user disconnected');
        });
   });
于 2018-11-12T19:22:21.250 に答える