【发布时间】:2016-11-28 20:48:54
【问题描述】:
我正在编写一个 JavaScript 的 sn-p 代码以与自定义 C# web-socket 服务器通信,并且按照建议的做法重试连接。
服务器,可能在JS准备好的时候还没有准备好,所以我需要做的是不断尝试连接到websocket,直到它最终成功。
推荐的做法,告诉我我需要捕获 onclose 事件或 onerror 事件,并在其中任何一个中尝试重新连接,最好使用某种退避策略。
根据这个建议,我想出了以下代码:
<html>
<head>
<title>WS</title>
</head>
<body>
<h1>WS</h1>
<button onclick="init()">Connect</button>
<button onclick="deInit()">Disconnect</button>
<button onclick="send()">Message</button>
<script>
var mySocket;
function init(){
mySocket = new WebSocket("ws://localhost:9000/foolish");
mySocket.onopen = function(){
console.log("OPEN");
};
mySocket.onclose = function(status){
console.log("CLOSE");
console.log(status);
if(status.code === 1006){
mySocket = new WebSocket("ws://localhost:9000/foolish");
}
};
mySocket.onerror = function(err){
console.log("ERROR");
console.log(err);
};
mySocket.onmessage = function(msg){
console.log("MESSAGE");
console.log(msg);
};
}
function deInit(){
mySocket.close();
}
function send(){
mySocket.Send("foo");
}
</script>
</body>
</html>
我尝试在错误处理程序中执行重新连接,并附加到“setTimeOut”调用,输出始终相同。
我的事件处理程序,触发一次,重新尝试连接,但第二次失败时,没有任何事件处理程序被触发,我只看到失败的尝试,如下图所示:
我读过的所有内容都告诉我,每次重试但连接失败时,我的错误处理程序和/或关闭处理程序应该继续触发,允许我选择处理错误,但它不会尝试两次并且放弃。
这发生在 IE11、IE10、Chrome 50+ 和 FireFox 最新版本中。
考虑到它在浏览器之间的一致性,那么我猜测它要么是设计使然,要么是我做错了,但我真的不明白问题出在哪里。
如果有人有任何想法,如果您能指出正确的方向,我将不胜感激。
【问题讨论】:
标签: javascript html error-handling websocket