var heartbeat,
ws = new WebSocket(url);
ws.onopen = function(e){
heartbeat = setInterval(function(){
ws.send({type:'heartbeat'});
},3e4);
plugin.emit('live.onopen', e, heartbeat);
},
ws.onerror = function(e){
plugin.emit('live.onerror',JSON.parse(e.data));
},
ws.onmessage = function(e){
plugin.emit('live.onmessage',JSON.parse(e.data));
},
ws.onclose = function(e){
plugin.emit('live.onclose',e);
};
return ws;
调用ws.close(); 链接依旧存在,执行close也没有报错
打日志看下
ws.close()
是否真的被调用到。还有你是怎么判定调用了
ws.close()
后没有关闭连接?ws.close()系统函数,没办法查看是否被真的调用,但是调用没有报错,就应该是调用了。执行ws.close()后,再次去执行连接websocket,会报错WebSocket is already in CLOSING or CLOSED state.
看起来其实应该已经是关闭了,但是重新执行上面的代码来重连接,就会报这个错误。
这说明连接已经关闭了。连接关闭了就不能再调用ws.send了,否则会有这个报错。比如连接关闭了要把你js里定时发送心跳的定时器删除,它引用的ws仍然是旧的连接对象,连接端口后定时器仍然执行
ws.send({type:'heartbeat'});
的时候就会出现WebSocket is already in CLOSING or CLOSED state.
这个错误了。onclose的时候你要把定时器删除