
<script language="javascript"> function connectSocketServer() { } connectSocketServer.prototype = { heartBeatIntervalCode: null, autoConnectIntervalCode: null, navigator: null, dropalert:null, connectState:false, getSpeed:function(){ try { this.connectState=false; this.getServerDelay('123.56.160.221:8889'); this.getServerDelay('123.56.160.221:8890'); this.getServerDelay('192.168.1.9:2012'); this.getServerDelay('39.106.111.41:8889'); this.getServerDelay('39.106.111.41:8890'); } catch (ex){ } }, getServerDelay:function(data){ try { let socket=new WebSocket('ws://'+data); socket.onopen=(()=>{ if(!this.connectState){ this.connectState=true; alert(data); } socket.close(); }); } catch (ex){ } } } var connectSocketServerNew = new connectSocketServer(); connectSocketServerNew.getSpeed(); </script>
如上代码getSpeed()中有5个this.getServerDelay()同步执行, 但是 这5个this.getServerDelay()中发起的5次websocket连接是异步执行,所以并非是第一个websocket服务器响应完成后才执行下一个websocket连接。可以理解成这5个连接是同时发起的,最快的服务器最先给客户端响应,从而最先改变this.connectState的状态,等其他较慢的服务器响应后对应的客户端的this.connectState已经被改变了,所以客户端剩下的几个请求在被响应后执行了与最快获得响应的那一次不一样的代码逻辑,即最快的那一次(不一定是第一次)执行了if(!this.connectState){ ...... } 判断里面的代码,而剩下的4次则未执行