gpt4 book ai didi

javascript - JavaScript WebSockets API 的机制

转载 作者:数据小太阳 更新时间:2023-10-29 04:35:13 26 4
gpt4 key购买 nike

我一直在尝试理解一些用于打开 websocket 的代码:

var ws = new WebSocket('ws://my.domain.com');
ws.onopen = function(event) {
...
}

我的问题是握手是如何开始的?如果它是在 WebSocket 构造函数中启动的,那么如果到那时还没有设置,如何调用 onopen 呢?如果 WebSocket 构造函数创建一个执行握手的线程,那么在握手结束之前是否必须足够快地定义 onopen ?如果是这样,那听起来有点危险,因为如果 JS 虚拟机变慢,握手可能会在定义 onopen 之前完成,这意味着事件没有得到处理。还是设置onopen函数触发握手?

有人可以向我解释一下 API 的机制吗?

最佳答案

在当前(同步)代码执行结束之前,它不会查找onopen 函数。这是因为连接(并因此调用 onopen 回调)是异步的。考虑:

let x = false;
setTimeout(function () {
x = true
}, 1000);
while(!x){
console.log('waiting!');
}

那里的 while 循环永远不会结束,但您可能会怀疑它会在一秒钟后结束。

如果您通过执行耗时(但同步)的代码来延迟 onopen 函数的初始化,那么这并不危险。另一方面,如果您对 onopen 进行 setTimeout 初始化,则无法保证在 WebSockets 连接准备就绪时它是否已定义,因为您无法确定哪个回调将先执行。

如果您在 C++ 中做同样的事情,您会为此使用线程。在 JavaScript 中,回调机制不是基于线程的;它只是表现得像线程(请参阅上面的无休止的 while 循环)。

Single thread executes one code-unit at a time and other code units are queued until the current code unit is finished executing

来源:http://www.slideshare.net/clutchski/writing-asynchronous-javascript-101

理解这一点很重要,即使您setTimeout 1 秒,它也可能不会在 一秒 后执行 - 如果线程正忙,它可能永远不会执行。

因此,如果您启动 WebSocket 连接并运行与上述类似的循环,但等待连接准备就绪,它可能永远不会结束。

对于不熟悉 JS 的程序员来说,这种行为可能看起来很奇怪。因此,为了可读性,我在可能的情况下同时或在需要它们的函数之后立即定义回调。

如果您想显式使用线程和并发执行,请阅读有关 Web Workers 的更多信息

引用:

关于javascript - JavaScript WebSockets API 的机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14367123/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com