2014-11-14 69 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

相关问题