2014-11-14 68 views
2

我這個代碼:節點JS:得到錯誤「監聽器必須是一個函數」

function myfunction(url_parts){ 
    fs.unlink(__dirname + '/temp/' + url_parts + '.pdf', function(err){ 
    if (err) console.log(err); 
    console.log('unlink ok'); 
    }); 
} 
var url_parts= 'filename' 
req.on("close", myfunction(url_parts)); 

我得到錯誤「監聽器必須是一個函數」。但是我的功能是一個功能:D有什麼問題? 我沒有得到這個錯誤,如果我沒有通過任何參數 myfunction,但我需要通過url_parts。 我不能使用匿名函數,因爲我需要在代碼的另一部分調用removeListener方法。

req.removeListener('close', myfunction); 
+1

嘗試'req.removeAllListeners('close');'。 – 2014-11-14 12:31:00

+1

不,錯誤在這裏 - > req.on(「close」,myfunction(url_parts)); – Radar155 2014-11-14 12:35:21

+0

如果'req'是'EventEmitter'的擴展,那麼你可以在那裏使用匿名函數並使用'req.removeAllListeners('close');'來移除監聽器。 – 2014-11-14 12:36:32

回答

3

您應該使用bind功能(分配到Function.prototype的)。您的代碼將成爲(更改的最後一行只)

function myfunction(url_parts){ 
    fs.unlink(__dirname + '/temp/' + url_parts + '.pdf', function(err){ 
    if (err) console.log(err); 
    console.log('unlink ok'); 
    }); 
} 
var url_parts= 'filename' 
req.on("close", myfunction.bind(null, url_parts)); 

綁定功能允許你創建一個新的功能,這將通過你調用bind給函數每次它是所謂的未來時定義的參數。

要在稍後刪除事件,您應該刪除綁定調用的結果,而不是原始函數。

+1

這應該是接受的答案... – 2016-01-16 12:24:25

+0

對不起,但我看到3年後的回覆。這是最好的答案 – Radar155 2018-02-05 16:42:58

0

AFAIK在Event.js中使用事件的任何事情都在EventEmitter上擴展。

你可以嘗試使用匿名函數中添加監聽器,並且將其刪除:

req.removeAllListeners('close'); 
+0

合併你的答案(removealllistener)與薩利姆的答案(呼叫我的功能內匿名函數)我解決了我的問題:D – Radar155 2014-11-14 13:03:35

相關問題