假设有一些对象订阅套接字服务器,如下所示:
socket.on('news', obj.socketEvent)
这些对象的生命周期很短,并且经常被创建,从而生成许多订阅。这看起来像是内存泄漏和容易出错的情况,直观上可以通过这种方式来防止:
socket.off('news', obj.socketEvent)
在对象被删除之前,但是遗憾的是,套接字中没有off方法。有没有其他方法可以做到这一点?
编辑:由于没有找到答案,我正在分配一个空方法来覆盖原始事件处理程序的包装器方法,下面是一个示例。
var _blank = function(){};
var cbProxy = function(){
obj.socketEvent.apply(obj, arguments)
};
var cbProxyProxy = function(){
cbProxy.apply ({}, arguments)
}
socket.on('news', cbProxyProxy);
// ...and to unsubscribe
cbProxy = _blank;发布于 2012-03-14 12:45:34
通过查看socket.io.js的源代码(在任何地方的文档中都找不到它),我发现了以下两个函数:
removeListener = function(name, fn)
removeAllListeners = function(name)我在我的应用程序中成功地使用了removeAllListeners;您应该能够从以下各项中进行选择:
socket.removeListener("news", cbProxy);
socket.removeAllListeners("news");此外,我认为您的cbProxy = _blank解决方案实际上不会起作用;这只会影响cbProxy变量,而不会影响任何实际的socket.io事件。
发布于 2013-08-09 22:02:13
如果您想创建只“监听”一次的监听程序,请使用socket.once('news',func)。在事件发生后,Socket.io会自动破坏监听器--它被称为“易失性监听器”。
发布于 2016-08-15 23:57:05
查看当前版本的Socket.io Client (1.4.8)的代码,似乎off,都指向相同的函数。
调用其中的任何一个,提供事件名称和/或回调,都可以得到所需的结果。不提供任何东西似乎会重置一切。
请谨慎对待fn/callback参数。它必须与代码中使用的实例相同。
示例:
var eventCallback = function(data) {
// do something nice
};
socket.off('eventName', eventCallback);会像预期的那样工作。
示例(也适用):
function eventCallback(data) {
// do something nice
}
socket.off('eventName', eventCallback);请注意,您试图移除的回调就是您传入的回调(这个回调可能会带来很多困惑和挫折)。此示例在初始回调周围实现了一个包装器,试图删除不起作用的包装器,因为要添加的实际回调是一个未公开的闭包实例:http://www.html5rocks.com/en/tutorials/frameworks/angular-websockets/
下面是代码库中特定行的链接:https://github.com/socketio/socket.io-client/blob/master/socket.io.js#L1597
https://stackoverflow.com/questions/9418697
复制相似问题