我正在尝试实现具有回退轮询功能的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...
}

关于javascript - 如何等待WebSocket readyState更改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13546424/

10-12 20:36