用什么代替 socket.removeAllListeners(); 在客户端

Aus*_*vis 4 sockets socket.io angularjs

我遇到了一个类似的问题来改进这个 AngularJS 工厂以与 socket.io 一起使用,但接受的答案似乎使用了一个不再存在的函数,所以socket.removeAllListeners();如果我需要删除一个监听器吗?我正在使用 socket.io v .9.16

Dai*_*wei 5

socket.removeAllListeners()还在。之所以不能调用,是因为真正的socket是这个:var socket = io.connect().

下面代码中的“socket”是angular factory返回的一个包装器,它只有两个方法:onemit

$scope.$on('$destroy', function (event) {
  socket.removeAllListeners();
  // or something like
  // socket.removeListener(this);
});
Run Code Online (Sandbox Code Playgroud)

您可以做的是getSocketsocket工厂添加一个新方法,如下所示:

app.factory('socket', function ($rootScope) {
  var socket = io.connect();
  return {
    on: function (eventName, callback) {
      // ...
    },
    emit: function (eventName, data, callback) {
      // ...
    },
    getSocket: function() {
      return socket;
    }
  };
});
Run Code Online (Sandbox Code Playgroud)

然后你可以做这样的事情:

$scope.$on('$destroy', function (event) {
  socket.getSocket().removeAllListeners();
  // or something like
  // socket.getSocket().removeListener(this);
});
Run Code Online (Sandbox Code Playgroud)