2012-01-12 6 views
1

は:node.js socket.ioこれはメモリリークですか?私はこのようなコードがある場合

io.sockets.on('connection', function (socket) { 
    // setup listeners for this socket   
    setup_socket_events(socket);  
}); 

function setup_socket_events(socket) 
{  
    socket.on('disconnect', function(){event_disconnect(socket);});   
} 

function event_disconnect(socket) 
{ 
    console.log("disconnect"); 
} 

ソケット切断を、これはメモリリークで、もしそうなら、なぜ、あなたはそれを阻止する方法を教えてください

UPDATE:次のコードを試す はassertvarnish

var assertvanish = require('assertvanish'); 
io.sockets.on('connection', function (socket) { 
    // setup listeners for this socket  
    setup_socket_events(socket);  
}); 

function setup_socket_events(socket) 
{ 
    socket.on('disconnect', event_disconnect(socket)); 
} 
function event_disconnect(socket) 
{ 

    return function() { 
    console.log("disconnect"); 
     // do something with socket 
     assertvanish(socket, 5000); 
    } 
} 
+0

具体的には、メモリリークについて不思議ですか? –

+0

また、 'on'呼び出しは' io.sockets.on( 'connection'、setup_socket_events); 'とすることができます。仲介機能は必要ありません。 –

+0

setup_socket_eventsにsocketを渡す必要はありませんか?私がメモリリークを心配している主要な理由は、私はどこか1つしか持っておらず、できるだけコードを単純化しているということです。 assertvanish(socket、10000)を使用します。 in event_disconnect私は循環的なメモリリークが表示されます。 – crickeys

答えて

0

ないメモリリークが存在しないから、環状アサーションを作成します。あなたはassertvanishを使っていると言っています。私はassertvanish(socket, 10000)はソケットが10秒後に削除されないと言っていると思います。これはあなたのソケットを永遠に生かし続けるためです。

+0

なぜですか? 'setup_socket_events'と' event_disconnect'を別の場所で再利用することを不可能にすることを除いて、可能な違いは何ですか?営業はクロージャーを使用していないので、利益はありません。しかし、OPのコードには、関数に名前が付いている(ツールの助けになります)、再利用できるという利点があります。 –

+0

あなたは正しく再利用していますが、setup_socket_events関数とevent_disconnect関数を再利用できる場所はわかりません...複数のソケットを開いていて、それらがすべて同じイベントを持ち、切断時に同じように動作させたい?それ以外では、私は間違いなく第2の形式でコードを書いています。なぜなら、2秒で理解できるからです。その関数呼び出しで何が起こっているのか分かるのに20秒かかりました...しかし、それは単なる個人的な好みです、 私は考えます。 –

+1

私はsetup_socket_eventsを使用しましたが、現実には関数はそれよりも多くのことを持っているので、この例では単純化しました。大規模なプロジェクトでは、すべての無名関数呼び出しを持つことが難しくなります。より多くの洞察のために私の新しい答えを見てください。 – crickeys

関連する問題