Node.js 中解除事件绑定

发布于 2024-10-04 14:08:13 字数 391 浏览 4 评论 0原文

我们以 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'

那么每次我在提示符下按 return 时,我都会得到

One
Two

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

Let's take stdin.on as an example. Callbacks to stdin.on stack, so if I write (in CoffeeScript)

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

then every time I hit return at the prompt, I get

One
Two

My question is, is there any way to remove/replace a callback once bound? Or is the only approach to bind a proxy callback and manage state myself?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

帅哥哥的热头脑 2024-10-11 14:08:13

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

API 文档中的示例:

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

因此,您需要一个变量来保存对回调的引用,因为显然,否则无法判断您想要删除哪个回调。

编辑
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'

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

You can use removeListener(eventType, callback) to remove an event, which should work with all kinds of emitters.

Example from the API docs:

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

So you need to have a variable that holds a reference to the callback, because obviously, it's otherwise impossible to tell which callback you want to have removed.

EDIT
Should be someone like this in 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'

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

请远离我 2024-10-11 14:08:13

或者您可以使用:

stdin.once 而不是 stdin.on

Or you can use:

stdin.once instead of stdin.on

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文