私は非常に奇妙な振る舞いを見つけたときにWebワーカーに対処しようとしています。何らかの理由で、実行中のコードがあるにもかかわらず、数秒後に終了します。Webワーカーはなぜ終了しましたか?
ここに私のコードです。
メインのJavaScriptファイル:
$(document).ready(function() {
var worker = new Worker("js/TestWorker.js");
worker.addEventListener('message', function (event) {
console.log(event.data);
});
worker.addEventListener('error', function (event) {
console.log(event);
});
});
ワーカーファイル:
(function() {
var updateCounter = 0;
var updater = function() {
updateCounter += 1;
console.log("Update counter: " + updateCounter);
postMessage("test");
setTimeout(updater, 10000);
};
updater();
})();
述べたように、労働者はわずか数秒、10-20secondsかそこら後に機能を停止します。
しかし、このコードをメインのJavaScriptファイルに追加すると、
var check = function() {
var localWorker = worker;
// setTimeout(check, 1000);
};
// setTimeout(check, 1000);
ワーカーは意図したとおりに動作します。 setTimeout-callsも必要ではないので、なぜコメントアウトされていますか? (私はちょうどaswell worker.lengthまたは類似のもので割り当てを置き換えることができますし、それはまだうまく動作することに注意してください。
誰かがこの動作を説明することはできますか?従業員が終了しつつあると(誤って)によってガベージコレクト?。ブラウザまたは何か他のものは、私が欠けている価値が注意することが
は私のブラウザ(クローム)のいずれかのコンソールにエラーや警告をoutputingされていないことであることをここで起こっている
EDIT:コードが無名関数内で実行されるかどうかにかかわらず、同じ動作が観察される。
EDIT2:ワーカー変数をグローバルスコープに配置すると、途中で終了することはありません。この理由は何でしょうか?
非常に好奇心。私は、WebワーカーがDOMノードと似ているという印象を受けました。これは、明示的にのみ殺すことができるということです(つまり、いくつかのリスナーを追加したため、範囲外/ガベージコレクションを外してはいけません)。 FireFoxなどで同じコードを試しましたか?私にはバグのように聞こえる。 – Dave
@Dave Yeah、ちょうどFirefoxでテストされています。 – jimka