この質問は、node-imap モジュールを使用していたときに頭に浮かびました。( https://github.com/mscdex/node-imapを参照)
このモジュールでは、fetch() メソッドは ImapFetch() オブジェクトを提供するコールバック関数を呼び出します。これは、コードが「メッセージ」イベントをリッスンすることを想定しています。次に、メッセージ イベントは、リッスンする必要があるイベントを含む各オブジェクトのメッセージ オブジェクトを渡します。
モジュールのサンプル コードは次のとおりです。
imap.fetch(results,
{ headers: ['from', 'to', 'subject', 'date'],
cb: function(fetch) {
fetch.on('message', function(msg) {
console.log('Saw message no. ' + msg.seqno);
msg.on('headers', function(hdrs) {
console.log('Headers for no. ' + msg.seqno + ': ' + show(hdrs));
});
msg.on('end', function() {
console.log('Finished message no. ' + msg.seqno);
});
});
}
}, function(err) {
if (err) throw err;
console.log('Done fetching all messages!');
imap.logout();
}
);
示されているように、リスナーは決して削除されません。プロセスが一度実行された直後に終了する場合は、これで問題ない可能性があります。ただし、プロセスが長時間実行されている場合、コードが繰り返し実行され、メモリ リークが発生しますか? つまり、リスナーは削除されないため、コマンドの実行中にのみ使用されるにもかかわらず、すべてのフェッチ オブジェクトとメッセージ オブジェクトが保持されます。
私の理解は間違っていますか?