AngularJS:socket.io破坏套接字

我正在使用一个节点的socket.io服务器和一个基于angular度的socket.io客户端(使用angular-socket.io ),除了在一个特定的条件下,它运作良好:我不知道如何彻底销毁sockets当套接字无法连接时,用它完成。

工作stream程是这样的:在一个给定的页面上有一个button来打开一个模式,模式的打开将sockets工厂注入到模块控制器中,并且连接到socket.io服务器。 这一切都很好,当套接字可以连接。 当模式closures时,调用$ scope.destroy并且模态控制器中的处理程序试图清理套接字。

这种模式可以closures和重新打开多次,或只有一次。 我多次创build/销毁套接字的过程可能是我的问题的一部分,这可能不是正确的范例,但是当模式被closures时,将无法与其交互,并且在页面离开之后套接字当然不会不需要存在或保持连接。

套接字创build:

angular.module('app.common.newSocketFactory', ['btford.socket-io']) .factory('newSocketFactory', ['socketFactory', function(socketFactory){ return function(){ return socketFactory({ioSocket:io.connect('http://localhost:3000', {forceNew: true})}); }; }]); 

注射:

 angular.module('...', [ 'app.common.newSocketFactory', .... ]) .controller('Controller', ['$scope', '$modalInstance', 'newSocketFactory', ... function ($scope, $modalInstance, newSocketFactory, ...){ ... $scope.socket = newSocketFactory(); 

这是我的销毁处理程序:

 $scope.$on('$destroy', function(){ $scope.socket.emit('unlisten'); $scope.socket.disconnect(); //have tried passing true too. }); 

这可以正确地工作,当套接字能够连接在模式closures之前,服务器中的断开的事件观察到客户端断开连接。 另外,我可以closures模​​式,然后closures服务器,不会尝试重新连接。

打开模式时closures服务器时,会发生TransportErrors并重新尝试连接。 如果此时closures模式,则错误将继续,如果重新启动服务器,则重试成功,客户端将连接到服务器。 这个最糟糕的部分是我使用这个套接字来保持一个硬件的primefaces访问,这个硬件被第一个套接字锁住了。 除非我重新启动服务器,请允许套接字连接,然后closures模式(在我的isolate scope和socket.disconnect()上触发$ destroy),我必须刷新整个页面才能销毁套接字。

这可能是一个angular-socket.io问题或一个普通的socket.io客户端问题。 我在angular-socket.io的github上询问,没有任何反应,如何正确地处理没有响应的angular-socket.io客户端套接字。

我的问题是这样的:A)如果我没有用socket.io做一个重要的伪造,我怎么能安全地处理这个客户端套接字?B)如果我做错了,有什么更好的方法来pipe理一个Web页面,不应该在页面之间持续存在。

注意:angular-socket.io套接字简单地包装了一些本地套接字,以帮助处理angular度范围。 当调用disconnect()时,结果就是底层套接字本身。 我已经尝试设置重新连接设置为false等,但没有一个工作,我不喜欢,甚至在范围被彻底摧毁后,即使我可以破解它停止尝试连接套接字似乎仍然存在。

谢谢

当我处理类似的问题时,我得出的结论是,SocketIO有一个混乱的状态pipe理至less说…所以我会尝试创build自己的重新连接逻辑,例如禁用断开或错误重新连接,只有重新连接,如果我想它来。

我也考虑使用本地SocketIO与状态处理程序,如(stuff) => $timeout(() => myHandler(stuff))并在其周围放置一个单一的angular度服务。 这样你的头不会因为closures模态,失去范围等而痛苦

也请发送你的结果,我很感兴趣,你从那以后经历。