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;
調(diào)用ws.close(); 鏈接依舊存在,執(zhí)行close也沒有報錯
打日志看下ws.close()
是否真的被調(diào)用到。
還有你是怎么判定調(diào)用了ws.close()
后沒有關(guān)閉連接?
ws.close()系統(tǒng)函數(shù),沒辦法查看是否被真的調(diào)用,但是調(diào)用沒有報錯,就應(yīng)該是調(diào)用了。執(zhí)行ws.close()后,再次去執(zhí)行連接websocket,會報錯WebSocket is already in CLOSING or CLOSED state.
這說明連接已經(jīng)關(guān)閉了。連接關(guān)閉了就不能再調(diào)用ws.send了,否則會有這個報錯。比如連接關(guān)閉了要把你js里定時發(fā)送心跳的定時器刪除,它引用的ws仍然是舊的連接對象,連接端口后定時器仍然執(zhí)行 ws.send({type:'heartbeat'});
的時候就會出現(xiàn)WebSocket is already in CLOSING or CLOSED state.
這個錯誤了。onclose的時候你要把定時器刪除