JavaScriptはスレッドを持っていない為、 処理待ちを行うには複雑な非同期処理を記述しなければなりません。 これはアプリケーションの実装において大きな負担となっていました。

WSJSは非同期処理を同期処理の様に記述できる機能を提供しています。 この機能を使うと疑似的にスレッドが使えます。

疑似スレッドを使用するには幾つか手順があります。

  • 拡張子を .exjs としたファイルで関数を定義すること。
  • 関数の中で yield 演算子を使用すること。
  • 関数の戻り値に対し next() 関数を呼び出すこと。
実際に動かしてみます。
以下のサンプルコードを d:/test/exjs/ に置きます。

steps.html:

steps.exjs: 疑似スレッドとなる関数

steps.jscp: サーバ側で時間のかかる関数

http://localhost:8080/wsjs/exjs/steps.html にアクセスします。
「GO-1」をクリックしてスレッドを開始します。 「GO-3」,「GO-2」をクリックして各々のスレッドを開始します。 各々のスレッドは独立して進行していきます。 最終的に全てのスレッドが完了します。

「GO-1」のスレッドが開始した後もボタンの操作は可能ですし、 他のスレッドも開始できています。

steps.html について説明します。
  • steps.exjs で疑似スレッドとなる関数を読み込んでいます。
  • steps.rpjs で時間のかかるサーバ側関数を読み込んでいます。
  • onclick="startSteps(~).next()" で疑似スレットを起動してます。
steps.exjs について説明します。
  • 関数 startSteps() が疑似スレッド関数となります。
  • yield step1Async(__This) はサーバ側関数の step1() を非同期に呼び出しています。
  • 非同期呼び出しを行う場合は関数名の後に "Async" を付けて最初の引数に __This を渡します。
  • 引数で渡されたノードに進行状況を書き込みます。
steps.jscp について説明します。
  • 時間のかかる処理のダミーとして3秒間スリープしています。

yield の仕様については以下を参照してください。 https://developer.mozilla.org/ja/New_in_JavaScript_1.7
尚、__This はWSJSの独自拡張でジェネレータの返したイテレータを示しています。