我计划使用 setInterval 简单地将一个变量设置为 false,主循环将检查该变量以停止。示例(注意:这只是一个示例,实际代码不是易于重构的 while() 循环,而是实际上由闭源软件生成的相当复杂且执行时间较长的脚本):
var running = true;
setInterval(function () {
if (running) {
console.log("Stopping now!");
running = false;
}
}, 100);
while (running) {
// do something ...
}
然而,它似乎不起作用,至少 Firefox 会在一段时间后删除一个“繁忙的脚本”框。上面的代码有什么问题?如果您的脚本已经运行,setInterval() 可能无法运行,否则?我找不到 setInterval() 的确切用途的确切规范。
我需要这样的东西,因为我已经有巨大的(并且执行时间很长)脚本,所以我想我会尝试在一段时间后停止它,然后使用 setTimeout() 让浏览器喘口气,然后继续:因为脚本本身确实知道其内部状态,因此它可以从任何点继续,但实际上并不是修改脚本的选项......
如果 setInterval 不可能,是否有任何替代方案,而不需要对“长时间执行”代码本身进行任何修改?
Thanks!
如果 setInterval 不可能,是否有任何替代方案,而不需要对“长时间执行”代码本身进行任何修改?
一种可能性是使其成为网络工作者 http://www.w3.org/TR/workers/而不是尝试在 UI 线程上使用它。尽管人们一再这么说,JavaScript 是not单线程(JavaScript,这种语言,在这个问题上保持沉默),甚至在浏览器上也不再存在。在浏览器环境中,有一个主要的UI线程,但您可以生成其他工作线程(网络工作线程)。工作人员和主 UI 代码可以通过以下方式进行通信postMessage
/ onmessage
.
这是一个正在运行的网络工作者的示例。此页面在 UI 线程上使用 JavaScript 来启动 Web Worker,该 Web Worker 在单独的线程上运行。 Worker 运行 10 秒,忙于更新计数器(这只是为了模拟长时间运行的计算密集型进程),并每秒向 UI 线程发送更新:
主页:
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Worker Example</title>
<style type="text/css">
body {
font-family: sans-serif;
}
</style>
<meta charset="UTF-8">
</head>
<body>
<script>
(function() {
var worker = new Worker("worker.js");
worker.onmessage = function(e) {
display("Worker says " + e.data);
};
display("Starting worker");
worker.postMessage("start");
function display(msg) {
var p = document.createElement('p');
p.innerHTML = String(msg);
document.body.appendChild(p);
}
})();
</script>
</body>
</html>
工人.js:
this.onmessage = function(e) {
var counter, lastUpdate, now;
if (e.data === "start") {
// Loop without yeilding for 10 seconds, sending updates
// to the UI every second.
start = lastUpdate = Date.now();
counter = 0;
do {
++counter;
now = Date.now();
if (now - lastUpdate > 1000) {
lastUpdate = now;
this.postMessage(counter);
}
}
while (now - start < 10000);
this.postMessage("Done");
}
};
(您不需要让工作人员等待消息开始,但这很常见。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)