2

次のようなJSコードを見ると:

socket = new WebSocket(server);

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

私はいつも少し混乱しています。onopenそのようなものを他の言語で書いた場合、接続が確立された後に「イベントハンドラー」がバインドserverされ、イベントを見逃す可能性が非常に高くなりますonopen。最初の行が Javascript インタープリターによって非同期に実行されたとしても、2 行目で遅すぎる可能性がわずかにありました。

上記のコードが 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 に答える