2013-05-21 76 views
1

有沒有辦法刪除一個匿名函數中包裝的傳入命名回調函數的偵聽器?刪除包含在匿名函數中的命名回調?

UPDATE。下面更完整的代碼示例。

這是細節。 我有一個函數,在一個命名的回調傳遞。

以前

function read (message, named_callback) { 

    var named_callback = named_callback || default_callback 
     , message  = message || "Choose: "; 

    stdout.write(message); 
    stdin.resume(); 
    stdin.setEncoding('utf8'); 
    stdin.on('data', named_callback); 
    }); 
}; 

所有named_callback。就拿,並準備在用戶輸入(回答)的光束。

answer = answer.trim().toLowerCase(); 

我最終在重複修剪和縮小行到處!我想把這一步移到一個地方,所以在它回到回調之前試圖準備好答案。 我寫了這個:

function read (message, named_callback) { 

    var named_callback = named_callback || default_callback 
     , message  = message || "Choose: "; 

    stdout.write(message); 
    stdin.resume(); 
    stdin.setEncoding('utf8'); 
    stdin.on('data', function (answer) { 
     answer = answer.trim().toLowerCase(); 
     named_callback(answer); 
    }); 
}; 

然而,這會導致無法刪除事件偵聽器,他們只是堆積,直到程序有太多的聽衆崩潰。

謝謝。

回答

2

問題可能不在您認爲的地方。你給我的信息會期望你每次都調用read方法,這就是tomanylisteners進入的地方,因爲你每次都追加一個新的'data'監聽器。如果你改變「上」到「曾經」您的應用程序不應該崩潰了:

stdin.once('data'... 

本課程心不是解決你的問題,它只是說明您的問題(它不是剪切/ tolowercase 。

如果你表現出更多的代碼一點點,也許我們能夠幫助您更好,但可能你的讀法就是不必要的開銷......

+0

謝謝回答。我更新了代碼,以便它更完整,因爲,就像我所做的那樣,它看起來像包裝函數並沒有增加任何價值,我認爲'一次'可以解決問題,用它重寫代碼。 CK。同時,您知道是否有其他方式來跟蹤聽衆並將其刪除? –

+0

@ hearandnow78'一次'方法解決了我的問題。感謝您提出建議。 –