根据MDN docs,在创建连接后 后,将注册WebSocket事件侦听器,并且该过程是顺序的:
// Create WebSocket connection.
const socket = new WebSocket('ws://localhost:8080');
// Connection opened
socket.addEventListener('open', function (event) {
console.log('ws connected');
});
// Listen for messages
socket.addEventListener('message', function (event) {
console.log('Message from server ', event.data);
});
如果事件在注册侦听器之前开始触发,该如何工作?假设在注册open
侦听器之前打开了连接,或者在注册message
侦听器之前收到了消息。
根据MDN doc on Concurrency model and Event Loop,由于事件监听器尚未注册,我希望事件会丢失:
在Web浏览器中,只要事件发生且附加了事件侦听器,便会添加消息。如果没有侦听器,则事件将丢失。因此,单击带有click事件处理程序的元素会添加一条消息-与其他任何事件一样。
我试图在两者之间添加一些昂贵的操作,但是似乎open
和message
事件监听器仅在所有事件监听器都正确注册后才触发。 WebSocket功能本质上是异步的吗?
// Create WebSocket connection.
const socket = new WebSocket('ws://localhost:8080');
// expensive ops
for (var i = 5000; i >= 0; i--) {
console.log('1');
}
// Connection opened
socket.addEventListener('open', function (event) {
console.log('ws connected');
});
// expensive ops
for (var i = 5000; i >= 0; i--) {
console.log('2');
}
// Listen for messages
socket.addEventListener('message', function (event) {
console.log('Message from server ', event.data);
});
// prints "1"s, then "2"s, then "ws connected", then "Message from server"
答案 0 :(得分:0)
您无法在创建对象之前添加事件,因此必须在事件之后添加。所有这些都是有效的,因为JavaScript是单线程的,并且事件是在同一线程中处理的,因此在代码运行时什么也不会发生。您可以将执行延迟一年,并且只有在代码完成后,运行时才会开始处理运行时到达的所有事件。在您的代码完成之前,套接字甚至可能没有开始连接。
因此,可以确保不会发生任何事件。
Mozilla开发人员网络对event loop有很好的解释,“运行完成”讨论了JS运行时的性质。