连接失败时需要重新连接 Web 套接字或需要重新启动以进行某些重新调整。我认为您不应该通过“重新启动控制器”来重新启动网络套接字。
我的建议是创建一个“网络套接字”服务来维护自己的逻辑(例如,连接失败时重新连接套接字),控制器只处理模型和视图绑定。
<html ng-app="MyApp">
....
<div ng-controller="MsgCtrl" ng-repeat="m in messages">{{m}}<br></div>
</html>
<script>
var myApp = angular.module("MyApp",[]);
myApp.factory("WebSocket",function(){
var ws;
var triedTime=0;
var maxRetryTime=20;
return {
createWS: function(server,protocol,handler){
ws = new WebSocket(server, protocol);
ws.onmessage = handler;
ws.onerror = function(e){
this.restartWS(server,protocol,handler);
}
},
closeWS: function(){
if(ws) ws.close();
},
restartWS: function(server,protocol,handler){
if(triedTime<=maxRetryTime){
this.closeWS();
this.createWS(server,protocol);
triedTime++;
}
}
};
});
function MsgCtrl($scope, WebSocket){
$scope.messages = [];
WebSocket.createWS("something","something",$scope.msgHandler);
$scope.msgHandler = function(e){
$scope.$apply(function() {
//model update
$scope.messages.push(e.data);
var msg = JSON.parse(e.data);
switch(msg.cmd)
{
case "restart":
WebSocket.restartWS("something","something",$scope.msgHandler);
break;
}
});
}
}
</script>
在上面的例子中,当 socket 客户端收到“restart”消息或连接失败时,web socket 将重新连接。希望这对你有帮助。