节点js:获取错误"监听器必须是一个函数"

时间:2014-11-14 12:13:51

标签: node.js listener

我有这段代码:

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什么错? 如果我没有将任何param 传递给myfunction,我就不会收到此错误,但我需要传递url_parts。 我不能使用匿名函数,因为我需要在代码的另一部分调用removeListener方法。

req.removeListener('close', myfunction);

2 个答案:

答案 0 :(得分:3)

您应该使用bind函数(Assigned to 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函数允许您创建一个新函数,该函数将在每次调用函数时调用bind函数时传递您定义的参数。

要在以后删除事件,您应该删除绑定调用的结果,而不是原始函数。

答案 1 :(得分:0)

AFAIK在Node.js中使用事件的任何东西都在EventEmitter上扩展。

您可以尝试使用匿名函数添加侦听器,并将其删除:

req.removeAllListeners('close');