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

Posted

技术标签:

【中文标题】用啥代替 socket.removeAllListeners();在客户端【英文标题】:What to use instead of socket.removeAllListeners(); on the client side用什么代替 socket.removeAllListeners();在客户端 【发布时间】:2014-01-27 06:54:12 【问题描述】:

我遇到了与Improve this AngularJS factory to use with socket.io 类似的问题,但接受的答案似乎使用了一个不再存在的函数,所以如果我在 angular.js 控制器中的客户端可以替代socket.removeAllListeners();需要删除一个监听器?我正在使用 socket.io v .9.16

【问题讨论】:

【参考方案1】:

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

以下代码中的“socket”是angular工厂返回的一个包装器,只有onemit两种方法。

$scope.$on('$destroy', function (event) 
  socket.removeAllListeners();
  // or something like
  // socket.removeListener(this);
);

你可以做的是像这样向socket工厂添加一个新的getSocket方法:

app.factory('socket', function ($rootScope) 
  var socket = io.connect();
  return 
    on: function (eventName, callback) 
      // ...
    ,
    emit: function (eventName, data, callback) 
      // ...
    ,
    getSocket: function() 
      return socket;
    
  ;
);

然后你可以这样做:

$scope.$on('$destroy', function (event) 
  socket.getSocket().removeAllListeners();
  // or something like
  // socket.getSocket().removeListener(this);
);

【讨论】:

非常感谢,我仍然习惯于使用包装函数。【参考方案2】:

如果您想将代码保留在服务本身中,您实际上可以将其添加到您要返回的对象中:

  removeAllListeners: function() 
     socket.removeAllListeners();
  

然后在您的控制器中,您只需调用 socket.removeAllListeners();

【讨论】:

以上是关于用啥代替 socket.removeAllListeners();在客户端的主要内容,如果未能解决你的问题,请参考以下文章

Android Gradle - 用啥代替 compileOnly?

Swift 4:NSFilenamesPboardType 不可用。用啥代替 registerForDraggedTypes?

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

JwtAccessTokenConverter 和 JwtTokenStore 被贬低了。可以用啥代替?

`shouldOverrideUrlLoading` 真的被弃用了吗?我可以用啥代替?

用啥来代替 JavaScript 中的类? [复制]