什么时候执行Javascript事件?

时间:2013-06-03 20:11:08

标签: javascript javascript-events language-agnostic javascript-engine

当我看到JS代码时:

        socket = new WebSocket(server);

        socket.onopen = function (evt) 
        {
                // STUFF
        };
我总是有点困惑。如果您使用任何其他语言编写类似的内容,onopen事件处理程序在与server的连接已建立之后被绑定的可能性非常大,导致您错过{{1}事件。即使第一行是由Javascript解释器异步执行的,在第二行上仍有可能太迟。

为什么上述代码在Javascript中运行良好,而在C#中(例如)它应该写成:

onopen

2 个答案:

答案 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(服务器)工作原理应该更加明显......