Pot.js - Pot.Workeroid.prototype methods

Pot.Workeroid.prototype methods

このセクションは Workeroid (Pot.Workeroid) の prototype メソッドを扱います。

Pot.Workeroid は、HTML5 API の Web Workers を柔軟に扱えるようにしたものです。
Worker が利用できない環境では、それをエミュレートし クロスブラウザに動作する Worker として作られています。
Web ブラウザ上では Worker を使用し、userscript (Greasemonkey) や XUL (Firefox アドオン) 上では
ChromeWorker が有効であればそれを使います。
どちらも利用できない場合は 単にバックグラウンドで実行されます。
どちらの場合でも、terminate() により途中で処理を終了させることが可能です。
メッセージの受け渡しには 従来の Worker と同じく postMessage() を使います。
同じくメッセージの受信イベントに onmessage, エラー時に onerror を使用します。
この際に addEventListener を利用することも可能です。
terminate() は、Worker スレッドの実行を中断または終了する際に使用します。
子 Worker スレッドでの importScripts() はスクリプトを読み込む際に使用します。
基本的にネイティブの Worker と同じように利用できます。

また、子 Worker から Pot オブジェクトが利用できます。
Pot.js が実行中でであれば Pot.js が、PotLite.js が実行中の場合は PotLite.js がデフォルトで利用可能です。
したがって、Pot.Deferred.forEach などを利用し CPU を抑えたループが利用できます。
子 Worker 内の Pot オブジェクトは、親スレッドでの Pot オブジェクトとは別ものです。

prototype メソッドは、new Pot.Workeroid(script) から返される
Pot.Workeroid インスタンスから実行できる関数/メソッドです。

Pot.Workeroid は、コンストラクタに ファイル名のほか、function や文字列を渡すことができます。
以下は function で Worker スレッドを生成する例です。

var worker = new Pot.Workeroid(function(data) {
    //                                          
    // このスコープの中が 子 Worker スレッド    
    //                                          
    var add = 1;                                
    postMessage(data + add);                    
});

// メッセージを受信した時
worker.onmessage = function(data) {
    alert(data);
};

// エラー時の設定 (任意)
worker.onerror = function(err) {
    alert(err);
};

// 1 を 子 Worker に送信 => 2 が alert される
worker.postMessage(1);

ファイル名を渡すことに慣れている場合、分かり難いかもしれませんが
コンストラクタに渡した function が、子 Worker の onmessage に設定されます。
つまり、渡した function は別スレッドで動きます。(エミュレート時以外)。

引数の data は、event.data にあたるものです。
function オブジェクトを直接指定した場合、event.data がそのまま 第一引数に返ります。
event オブジェクトを取得したい場合は、第二引数で取得できます。

Pot.globalize() が適応されている場合、 例えば new Pot.Workeroid が、 new Workeroid と実行できます。

コンストラクタの例を含む詳細は new Workeroid から参照ください。


このリファレンスのサンプルコードの多くは、 便宜上 Pot.globalize() が適応されたと仮定して記述しています。
例えば、Pot.forEach として定義されている関数を forEach(...) と表現している場合があります。 これは、Pot.globalize() がされていない場合 Pot.forEach(...) として呼び出せます。 他の関数も同様です。
Pot.globalize() が適応済みの場合、定義名のままで呼び出せます。

また、サンプルコードでは コンソールに出力するデバッグ用関数 Pot.debug() を多用しています。
Pot.debug() を、たんに debug() と表している場合もあります。
Pot.debug については このセクションで扱っているので詳しくはメニューから参照ください。

このリファレンスは Pot.js, PotLite.js の関数を事細かく解説しているわけではないので、 足りない情報があるかもしれません。
より詳しくは ソースコードから自動生成された JSDoc ドキュメント (Pot.js) or JSDoc ドキュメント (PotLite.js) または直接ソースコードを参照ください。