如何在附加onopen处理程序之前确保Websocket没有打开?

时间:2017-06-12 08:14:24

标签: javascript websocket

我不理解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事件?

1 个答案:

答案 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