onopen
在当前(同步)代码执行结束之前,它不会寻找函数。那是因为连接(因此调用onopen
回调)是异步的。考虑:
let x = false;
setTimeout(function () {
x = true
}, 1000);
while(!x){
console.log('waiting!');
}
那里的while
循环永远不会结束,但你可能会怀疑它会在一秒钟后结束。
如果您onopen
通过执行耗时(但同步)的代码来延迟函数的初始化,那么这并不危险。另一方面,如果您setTimeout
初始化,onopen
则无法保证在 WebSockets 连接准备好时是否已定义它,因为您无法确定首先执行哪个回调。
如果你在 C++ 中做同样的事情,你会为此使用线程。在 JavaScript 中,回调机制不是基于线程的;它只是表现得像线程(参见上面的无限循环)。
单线程一次执行一个代码单元,其他代码单元排队,直到当前代码单元完成执行
来源:http ://www.slideshare.net/clutchski/writing-asynchronous-javascript-101
重要的是要了解,即使您在 1 秒内执行某些操作setTimeout
,它也可能不会在一秒钟后执行- 如果线程很忙,它可能永远不会被执行。
因此,如果您启动 WebSocket 连接并运行类似于上述循环但等待连接准备好它可能永远不会结束。
对于不熟悉 JS 的程序员来说,这种行为可能看起来很奇怪。因此,为了便于阅读,我尽可能在需要它们的函数的同时或紧随其后定义回调。
如果您想显式使用线程和并发执行,请阅读有关Web Workers的更多信息
参考: