小さな例:
var str = "http://" + document.domain + "/classes/js/workers/worker.js"; var worker = new Worker(str); worker.onerror = function(e) { alert([ 'ERROR: Line ', e.lineno, ' in ', e.filename, ': ', e.message].join('')); } worker.onmessage = function (obj) { alert(obj['data']); } worker.postMessage();
ワーカーコード(some.jsにグローバル変数テストがあるとします):
onmessage = function () { importScripts("/classes/js/some.js"); postMessage(test); }
上記のコードは、最初の呼び出し時にテスト変数の内容を忠実に表示しますが、期待値の代わりに繰り返し呼び出しを行うと、テスト変数が定義されていないというエラーが表示されます。 正確な理由により、importScriptsは繰り返し実行されません。 数時間苦労して、解決策を見つけました。 簡単です。オペラは新しく作成されたオブジェクトにスクリプトを再インポートしたくないため、新しいオブジェクトを作成せず、1つだけを作成してグローバルにし、将来的にはすべてを送信します。 以前のコードは、次のようにアップグレードできます。
if(!('worker' in window)) { var str = "http://" + document.domain + "/classes/js/workers/worker.js"; worker = new Worker(str); worker.onerror = function(e) { alert([ 'ERROR: Line ', e.lineno, ' in ', e.filename, ': ', e.message].join('')); } } worker.onmessage = function (obj) { alert(obj['data']); } worker.postMessage();
同時に、onmessageハンドラーを条件内に配置しないでください。関数内の変数がその内部で使用される場合、最初の呼び出しの変数への短絡が作成され、後続の変数は無視されます。
importScriptsのバグがすぐに修正されることを願っています。結局のところ、この技術はまだ新鮮であり、時にはユーザーではなくベータテスターのように感じるかもしれません...
PSメモが誰かに役立つことを願っています