2

当我查看 JS 代码时:

socket = new WebSocket(server);

socket.onopen = function (evt) 
{
        // STUFF
};

我总是有点困惑。onopen如果您用任何其他语言编写类似的内容,那么在连接server已经建立之后,“事件处理程序”将很有可能被绑定,从而导致您错过onopen事件。即使第一行是由 Javascript 解释器异步执行的,第二行仍然有可能太晚了。

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

WebSocket socket = new WebSocket();

socket.onopen = new EventHandler<EventArgs>(Open);

socket.Connect(server);
4

2 回答 2

1

与大多数其他语言不同,Javascript 是严格的单线程的。
当您的代码正在运行时,不会发生任何其他事情。

onopen直到控制返回事件循环(在该代码的同步部分完成之后)才能触发。

请注意,这是正确的,因为onopen它是响应异步事件(在本例中为套接字)而触发的。
如果它是同步提出的,那将是不正确的;要解决此问题,同步引发与此模式一起使用的事件的代码应在process.nextTick.

于 2013-06-03T20:13:48.943 回答
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") );
};

这应该比为什么 new Socket(server) 工作更明显......

于 2013-06-03T20:28:46.920 回答