2017-06-12 180 views
0

有一部分Websockets API我不明白。如何在连接onopen处理程序之前确保WebSocket未打开?

onOpen事件处理程序通常用于开始向服务器发送消息,因为在套接字打开并准备就绪之前我们无法做到这一点。

根据任何代码示例我可以找到(documentation),这是登记在网页套接字的onOpen事件处理程序的常见方法:

1: const socket = new WebSocket('ws://localhost:8080'); 
2: 
3: socket.addEventListener('open', function (event) { 
4:  socket.send('Hello Server!'); 
5: }); 

但是网页套接字contstructor呼叫(第1行)创建的WebSocket and attempts to open a connection to the server ,而事件处理程序稍后会附加(第3行)。

因此:在连接建立(非常)快的情况下,当我们到达第3行时socket已经打开
在这种情况下,我们将错过open事件,因为事件处理程序在发生时没有注册。

我们如何保证收到open事件?

回答

2

浏览器中的JavaScript实现是异步和单线程的。当然,它可以在内部使用多个工作线程(例如,用于输入/输出操作或定时器),但是您的应用程序代码在具有事件循环的一个线程上执行。

当您通过网页套接字连接到服务器:

var socket = new WebSocket('ws://localhost:8080'); 

的JavaScript线程开始异步操作的连接插座,并立即继续运行下一个代码。只有当它返回到事件循环时,才能从异步操作接收事件。这意味着,无论建立连接的速度如何之快,您的听众都将始终被解雇。

我还建议你检查这个问题:

How does Asynchronous programming work in a single threaded programming model?

你会发现有一个更好一点和扩展的解释。请注意,Node.js和Chromium使用V8 JavaScript engine

+0

因此,即使我在上面的脚本的第6行添加了非常耗时的操作,我的事件处理程序也不会错过? –

+0

没错。另外,由于主线程事件循环将被阻止,并且您不会收到任何事件,因此您的网页可能会在长时间运行的操作期间滞后。 – berserkk

+0

有趣,而且很有意义。谢谢! –

相关问题