Javascript 网箱开启正时

Javascript 网箱开启正时,javascript,websocket,Javascript,Websocket,我有一个关于websocket何时打开的问题 它似乎一直挂起,直到我的类的构造函数完成为止,不管花了多少时间。这是一种内部浏览器机制还是以下代码会有竞争条件 class TestSockets { constructor() { this.csrf = getCSRF() this.socketURL = "wss://" + window.location.hostname + "/path?csrf=" + this.csrf; thi

我有一个关于websocket何时打开的问题

它似乎一直挂起,直到我的类的构造函数完成为止,不管花了多少时间。这是一种内部浏览器机制还是以下代码会有竞争条件

class TestSockets {
    constructor() {
        this.csrf = getCSRF()
        this.socketURL = "wss://" + window.location.hostname + "/path?csrf=" + this.csrf;
        this.WSConnection = new WebSocket(this.socketURL);

        wait(10000)

        console.log(this.WSConnection.readyState)
        this.WSConnection.onmessage = function (e) {
            console.log('Server: ' + e.data);
        };

        wait(10000)
        console.log(this.WSConnection.readyState)
    }

    getMessage1() {    
        this.WSConnection.send('{"name":"messageinfo","args":[{}]}')
    }

    getMessage2() {    
        this.WSConnection.send('{"name":"messageinfo2","args":[{}]}')
    }

    getMessage3() {    
        this.WSConnection.send('{"name":"messageinfo3","args":[{}]}')
    }

    close() {
        this.WSConnection.close()
    }

}
用法是

let ts = new TestSockets()
ts.getMessage1()
ts.getMessage2()
ts.close()
目前忽略这一点的有用性,因为这主要是一个示例,因此我可以得到关于何时出现开放的解释。我注意到套接字一直挂起,直到构造函数结束。我尝试了很多不同的方法,但我无法确定插座应该在什么时候打开

如果它是因为构造函数关闭而打开的,那么WebSocket就是这样工作的,它们会在作用域完成时打开吗?或者是我的速度太快,无法看到它以异步方式打开,而我有阻止代码来阻止它

我不确定我的代码是否只是因为构造器或者其他原因才这样做的,对这一点的任何洞察都会很棒

编辑 阻塞等待功能:

function wait(ms) {
    var start = Date.now(),
        now = start;
    while (now - start < ms) {
      now = Date.now();
    }
}
函数等待(毫秒){
var start=Date.now(),
现在=开始;
同时(现在-开始<毫秒){
now=Date.now();
}
}
编辑2

在进一步搜索时,我偶然发现了我正在寻找的术语“事件循环”,在其中我发现了


我认为这个问题已经解决了,它并不是这个问题的翻版,但我认为它还是回答了这个问题。我已将其标记为副本。

浏览器中的JavaScript不是。因此,当您在等待功能中忙于睡眠时,websocket也没有连接。你需要异步才能得到想要的。另外,也许可以尝试添加一个
onopen
处理程序来验证套接字是否处于打开状态?不,这并不能完全回答我的问题,更多的是关于何时将“打开”添加到调用堆栈中,正如我所理解的“异步”浏览器中的项目是指HTTP请求或套接字的进程在它自己的线程中。然后回调被推回调用堆栈。我的问题是,如果我在构造函数中有足够的逻辑,那么在调用“getMessage”函数之前是否可能将回调放回调用堆栈。我使用onopen并手动调用getMessage1,但它无法工作,因为套接字已经打开。所以我对计时很感兴趣。我正在玩更多其他异步的例子,我假设套接字是异步的,但我不确定将异步调用添加回调用堆栈的计时。我正在搞乱Loupe,看看我是否能得到一个清晰的答案,或者至少是更好的问题。我认为这个页面更接近我的问题,我只需要术语,“事件循环”只在调用堆栈为空时查找异步响应,这就是为什么当我手动运行它时,它会在我运行函数之前完成,但当它们在调用堆栈上同时被调用时,情况就不是这样了。