在Node.js中解除事件绑定

24

让我们以 stdin.on 为例。对于 stdin.on 的回调函数会形成一个栈结构,因此如果我这样写(用 CoffeScript):

stdin = process.openStdin()
stdin.setEncoding 'utf8'
stdin.on 'data', (input) -> console.log 'One'
stdin.on 'data', (input) -> console.log 'Two'

然后每次我在提示符处按回车,我会得到:

One
Two

我的问题是,有没有办法在绑定回调后删除/替换它?还是唯一的方法是绑定代理回调并自己管理状态?


如何删除内联监听器函数? 例如 server.on('connect', function(pkt){...}); - kBisla
2个回答

40
你可以使用removeListener(eventType, callback)来移除一个事件,这适用于所有类型的emitter。

来自API文档的示例:

var callback = function(stream) {
  console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);

所以你需要一个变量来保存对回调函数的引用,因为很明显,否则无法确定要删除哪个回调函数。

编辑
在计算机科学中应该像这样:

stdin = process.openStdin()
stdin.setEncoding 'utf8'

logger = (input) -> console.log 'One'
stdin.on 'data', logger
stdin.removeListener 'data', logger

stdin.on 'data', (input) -> console.log 'Two'

参见:http://nodejs.org/docs/latest/api/events.html#emitter.removeListener


谢谢,那很清楚明白! - Trevor Burnham
1
这个很好用,但有没有办法删除内联监听函数?例如 server.on('connect', function(pkt){...}); - kBisla

18
你可以使用以下语句:

stdin.once 代替 stdin.on


此语句涉及IT技术。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接