【发布时间】:2016-07-22 11:02:54
【问题描述】:
当我遇到一个非常特殊的行为时,我正在尝试处理网络工作者。出于某种原因,它在几秒钟后终止,即使我有代码正在运行。
这是我的代码;
主 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-20 秒左右后停止工作。
但如果我将这段代码添加到我的主 JavaScript 文件中;
var check = function () {
var localWorker = worker;
// setTimeout(check, 1000);
};
// setTimeout(check, 1000);
工人按预期工作。也不需要 setTimeout 调用,因此它们被注释掉了。 (请注意,我也可以将作业替换为 worker.length 或类似的东西,它仍然可以正常工作。
有人可以解释这种行为吗?工作人员是否被终止并(错误地)被浏览器收集垃圾,或者这里发生了我错过的其他事情?
值得注意的是,我的浏览器 (Chrome) 也没有向控制台输出任何错误或警告。
编辑:无论代码是否在匿名函数内执行,都会观察到相同的行为。
EDIT2:如果我将工作变量放在全局范围内,它不会过早终止。这可能是什么原因?
【问题讨论】:
-
很好奇。我的印象是 web worker 类似于 DOM 节点,因为它们只能被明确地杀死(即它们不应该简单地超出范围/垃圾收集,特别是因为你已经添加了一些侦听器)。您是否在 FireFox 等中尝试过相同的代码?在我看来,这听起来像是一个错误。
-
@Dave 是的,刚刚在 Firefox 中测试过,可以正常工作。
标签: javascript