我的脚本运行时是否调用了 setInterval 处理程序?

2023-12-26

我计划使用 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(使用前将#替换为@)

我的脚本运行时是否调用了 setInterval 处理程序? 的相关文章

随机推荐