OperaでimportScripts()を解決する

すべての人に良い一日を! 文字通り今日、Web Workersを使用しているときにimportScripts()関数で問題が発生しました。これは、Opera(バージョン11.61を使用)の内部的な理由により、Workerオブジェクトを再作成するときに、その内部でimportScripts()関数の実行を拒否する(問題が発生する)オペラでのみ、他のブラウザは適切に動作します)。





小さな例:



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メモが誰かに役立つことを願っています



All Articles