我正在尝试实现一个可以回退到轮询的 WebSocket。如果WebSocket连接成功,readyState
变为1,但如果失败,readyState
是 3,我应该开始轮询。
我尝试过这样的事情:
var socket = new WebSocket(url);
socket.onmessage = onmsg;
while (socket.readyState == 0)
{
}
if (socket.readyState != 1)
{
// fall back to polling
setInterval(poll, interval);
}
我正期待着socket.readyState
异步更新,让我立即阅读。然而,当我运行这个程序时,我的浏览器冻结了(我将其打开了大约半分钟才放弃)。
我想也许有一个onreadyStateChanged
事件,但我在 MDN 参考中没有看到这一事件。
我应该如何实施这个?显然空循环是行不通的,而且没有任何事件可以实现这一点。
这很简单,而且工作完美...您可以添加有关最大时间或尝试次数的条件,以使其更加稳健...
function sendMessage(msg){
// Wait until the state of the socket is not ready and send the message when it is...
waitForSocketConnection(ws, function(){
console.log("message sent!!!");
ws.send(msg);
});
}
// Make the function wait until the connection is made...
function waitForSocketConnection(socket, callback){
setTimeout(
function () {
if (socket.readyState === 1) {
console.log("Connection is made")
if (callback != null){
callback();
}
} else {
console.log("wait for connection...")
waitForSocketConnection(socket, callback);
}
}, 5); // wait 5 milisecond for the connection...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)