在Node.js中解除绑定事件

Tre*_*ham 23 javascript-events node.js coffeescript

我们stdin.on以此为例.回调stdin.on堆栈,所以如果我写(在CoffeeScript中)

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

然后,每当我在提示符处返回时,我都会得到

One
Two
Run Code Online (Sandbox Code Playgroud)

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

Ivo*_*zel 35

您可以使用removeListener(eventType, callback)删除事件,该事件应适用于所有类型的发射器.

API文档中的示例:

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

所以你需要有一个变量来保存对回调的引用,因为很明显,否则你不可能知道要删除哪个回调.

编辑
在CS中应该是这样的人:

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'
Run Code Online (Sandbox Code Playgroud)

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


vim*_*ude 18

或者您可以使用:

stdin.once 代替 stdin.on