我不理解Websockets API的一部分。
onOpen
事件处理程序通常用于开始向服务器发送消息,因为我们无法在套接字打开并准备就绪之前执行此操作。
根据我可以找到的任何代码示例(documentation),这是在Websocket上注册onOpen
事件处理程序的常用方法:
1: const socket = new WebSocket('ws://localhost:8080');
2:
3: socket.addEventListener('open', function (event) {
4: socket.send('Hello Server!');
5: });
但WebSocket contstructor调用(第1行)创建websocket and attempts to open a connection to the server,而事件处理程序稍后附加(第3行)。
所以:如果(非常)快速建立连接,当我们到达第3行时,socket
是否已经打开是不可能的?
在这种情况下,我们将错过open
事件,因为我们在事件发生时没有为它注册事件处理程序。
我们如何保证收到open
事件?
答案 0 :(得分:2)
浏览器中的JavaScript实现是异步和单线程的。当然,它可以在内部使用多个工作线程(例如,用于输入/输出操作或定时器),但是您的应用程序代码在具有事件循环的一个线程上执行。
当您通过WebSocket连接到服务器时:
var socket = new WebSocket('ws://localhost:8080');
JavaScript线程启动异步操作以连接套接字并立即继续运行下一个代码。它只有在返回事件循环时才能从异步操作中接收事件。这意味着,无论连接建立的速度有多快,您的onOpen
听众都会被解雇。
我还建议你查看这个问题:
How does Asynchronous programming work in a single threaded programming model?
你会发现有一些更好的和扩展的解释。请注意,Node {js和Chromium使用V8 JavaScript engine。