Vid*_*dal 5 javascript websocket
Websockets API有一部分我不明白。
事件onOpen处理程序通常用于开始向服务器发送消息,因为在套接字打开并准备就绪之前我们无法执行此操作。
根据我能找到的任何代码示例(文档onOpen),这是在 Websocket 上注册事件处理程序的常用方法:
1: const socket = new WebSocket('ws://localhost:8080');
2:
3: socket.addEventListener('open', function (event) {
4: socket.send('Hello Server!');
5: });
Run Code Online (Sandbox Code Playgroud)
但是 WebSocket 构造函数调用(第 1 行)创建 websocket并尝试打开与服务器的连接,而事件处理程序稍后附加(第 3 行)。
那么:在连接(非常)快速建立的情况下,当我们到达第 3 行时,连接是否不可能socket 已经打开?
在这种情况下,我们将错过该open事件,因为在事件发生时我们没有为其注册事件处理程序。
我们如何保证收到该open事件?
浏览器中的 JavaScript 实现是异步且单线程的。当然,它可以在内部使用多个工作线程(例如,用于输入/输出操作或计时器),但您的应用程序代码是在具有事件循环的一个线程上执行的。
当您通过WebSocket连接到服务器时:
var socket = new WebSocket('ws://localhost:8080');
Run Code Online (Sandbox Code Playgroud)
JavaScript 线程启动连接套接字的异步操作,并立即继续运行下一个代码。只有当它返回到事件循环时,它才能接收来自异步操作的事件。这意味着,onOpen无论建立连接的速度有多快,您的侦听器都将始终被触发。
我还建议您检查这个问题:
您会发现有更好的和扩展的解释。请注意,Node.js 和 Chromium 使用V8 JavaScript 引擎。
| 归档时间: |
|
| 查看次数: |
1594 次 |
| 最近记录: |