当我看着教程/约WebSockets的文档,我觉得像代码这样:
var ws = new WebSocket("ws://localhost:8765/dlt");
ws.onopen = () => {
// do some very important stuff after connection has been established
console.log("onopen");
}
但是这里的比赛条件呢?是否有某种方式避免使用JavaScript?
例如,此代码(仅onopen
在打开连接后分配)将失败:
var ws = new WebSocket("ws://localhost:8765/dlt");
setTimeout(() => {
ws.onopen = () => {
// do some very important stuff after connection has been established
console.log("onopen"); /// <== won't be called
}
}, 100);
我可以确定在建立连接之前已经完成分配了吗?
(我尝试WebSocket
使用自定义onopen()
方法进行扩展,但这似乎不起作用)
class MyWebSocket extends WebSocket {
onopen() {
console.log("onopen()");
/// do some very important stuff after connection has been established
}
}
您应该阅读有关javascript的事件循环的信息:https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/EventLoop#Event_loop
如果查看关于的部分Run-to-completion
,则会得到以下有用的解释:
在处理任何其他消息之前,将完全处理每个消息。在推理程序时,这提供了一些不错的属性,包括以下事实:无论何时运行一个函数,都不能抢占它,并且会在其他任何代码运行之前完全运行(并且可以修改该函数操作的数据)。例如,这与C不同,在C中,如果函数在线程中运行,则运行时系统可能会在任何时候将其停止以在另一个线程中运行其他代码。
因此,在您的示例中,ws.onopen
必须先完成对的分配,然后websocket才能执行任何本质上异步的操作。通过将您的分配放入setTimeout
,您可以将其移到当前正在运行的上下文之外,因此在websocket要求它之前可能无法执行它。
但是,诚然,websocket api确实令人困惑,并且可以以更直观的方式进行设计。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句