当我看到JS代码时:
socket = new WebSocket(server);
socket.onopen = function (evt)
{
// STUFF
};
我总是有点困惑。如果您使用任何其他语言编写类似的内容,onopen
事件处理程序在与server
的连接已建立之后被绑定的可能性非常大,导致您错过{{1}事件。即使第一行是由Javascript解释器异步执行的,在第二行上仍有可能太迟。
为什么上述代码在Javascript中运行良好,而在C#中(例如)它应该写成:
onopen
答案 0 :(得分:1)
与大多数其他语言不同,Javascript严格来说是单线程的 在您的代码运行时,不会发生任何其他事情。
onopen
无法触发,直到控制返回到事件循环(在该代码的同步部分完成之后)。
请注意,这是正确的,因为onopen
是为响应异步事件而触发的(在本例中为套接字)。
如果它是同步提升的,那就不是真的;要解决此问题,同步引发此模式使用的事件的代码应在process.nextTick
中异步引发事件。
答案 1 :(得分:0)
DIY版本可能比黑盒本机功能更容易可视化:
function Sock(url){
this.init=function(){
this.url=url;
this.onopen.call(this, {name:"open", url:url, dt: +new Date});
} .bind(this);
setTimeout(this.init, 0);
}
socket = new Sock("123");
socket.onopen = function (evt) {
alert( JSON.stringify(evt, null, "\t") );
};
为什么这个工作比新的Socket(服务器)工作原理应该更加明显......