« SessionStorageのスコープ | メイン | CSS3アニメのjQueryプラグインを作ってみた »

2014年3月 5日 (水)

JavaScriptのWebSocket API

ブラウザのJavaScriptはシングルスレッドで動いている。

そんなことは知っている。

いや、知ってはいてもちょいちょい忘れてていけてないコードを書いちゃうこともあるのだ。

JavaScriptでのWebSocketの使い方は以下のようなコードになる

 

1var ws = new WebSocket("ws:...");
2ws.onopen = function(e) { ...};
3ws.onmessage = function(e) { ...};

 

このコードを見て「onopenをバインドするよりも前に接続が確立しちゃったらどうなるんだろう?」と疑問に思わないだろうか?

でも、実際にはそんなことは起こらない。何故ならWebSocketの接続が行われるのはコンストラクタを実行している関数の処理を抜けた後だから。

このことは以下のようなコードで検証できる。

 

01function init() {
02    console.log("Start init: " + new Date().getTime());
03    var ws = new WebSocket("ws:...");
04    ws.onopen = function(e) {
05        console.log("WebSocket open: " + new Date().getTime());
06    }
07    for (var i=0; i<1000000; i++) {
08        var dummy = new Date();
09    }
10    console.log("End init: " + new Date().getTime())
11}

 

空ループを回さなければ20ms以下で接続が確立するが、このコードではループが終了するまで接続は行われないので数秒のタイムラグがある。

言い換えれば「End init」のログは常に「WebSocket open」よりも先に出力される

(ただしFirefoxでFireBugを動かしていると途中で「スクリプトが応答していません。」のようなダイアログが表示されることがあり、その場合はそこに割り込んでWebSocketの接続が行われる。)

何が言いたいかと言うと、

 

1function init() {
2    var ws = new WebSocket("ws:...");
3    //なんか重たい処理
4    ws.send("hoge");
5}

 

のようなコードは途中にどれだけ重たい処理があっても必ず失敗するのでちゃんとonopenを使おうという話でした。

コメント

コメントを投稿

採用情報

株式会社フレクトでは、事業拡大のため、
Salesforce/Force.comのアプリケーション
開発
HerokuやAWSなどのクラウドプラッ
トフォーム上でのWebアプリケーション開発

エンジニア、マネージャーを募集中です。

未経験でも、これからクラウドをやってみた
い方、是非ご応募下さい。

フレクト採用ページへ

会社紹介

株式会社フレクトは、
認定コンサルタント
認定上級デベロッパー
認定デベロッパー
が在籍している、
セールスフォースパートナーです。
heroku partnersにも登録されています。
herokuパートナー
株式会社フレクトのSalesforce/Force.com
導入支援サービス
弊社の認定プロフェッショナルが支援致します。
・Visualforce/Apexによるアプリ開発
・Salesforceと連携するWebアプリ開発
も承っております。
セールスフォースご検討の際は、
お気軽にお問合せください。
Powered by Six Apart