gpt4 book ai didi

javascript - 是否可以限制 socket.io 每个事件只有一个监听器?

转载 作者:行者123 更新时间:2023-11-30 11:35:37 25 4
gpt4 key购买 nike

我的问题是是否可以限制特定事件的绑定(bind)监听器可能性?例如我有一个监听器:

//In server
socket.emit('something', { message: 'Hello World!' });

//At client
socket.on('something', (data) => {
console.log(data.message);
});

//Output in console
Hello World!

但是,如果我在代码中的其他位置复制该片段,我会将 2 个相同的监听器绑定(bind)到一个事件,因此我会得到 2 个控制台日志,而我只需要一个。

//In server
socket.emit('something', { message: 'Hello World!' });

//At client
socket.on('something', (data) => {
console.log(data.message);
});

socket.on('something', (data) => {
console.log(data.message);
});

//Output in console
Hello World!
Hello World!

我知道对于单个事件的不同操作可能有多个监听器,但是当我在某些框架中使用 socket.io 并在组件之间切换时(我在组件的构造函数中进行了绑定(bind)),框架只会绑定(bind)相同的监听器每次我在组件之间切换时监听相同的事件。所以结果就像上面这样。

所以我的问题是:

  • 是否可以检查某个事件是否已经有监听器并忽略第二个绑定(bind)?
  • 或者,如果有一些 socket.io 配置设置允许每个事件仅绑定(bind)一个监听器,并且当您绑定(bind)新监听器时,它会覆盖旧监听器?
  • 或者只是一些关于如何处理此类情况的良好做法?

最佳答案

jfriend00的答案可以进一步简化b/c Emitter类有一个名为hasListeners的方法,https://socket.io/docs/client-api/

The socket actually inherits every method of the Emitter class, like hasListeners, once or off (to remove an event listener).

let exist = socket.hasListeners(eventName)
if (exist) {
// maybe just return
} else {
// the usual stuff
socket.on(eventName, ...)
}

关于javascript - 是否可以限制 socket.io 每个事件只有一个监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44570697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com