我有一个程序,它会写入很多 if 结果。例如,这个:
const a = prompt();
for(let i = 1; i < a; i ++) {
console.log(i);
}
(不是实际的代码)
因此,当您输入一个大数字时,会有大量答案等待输入控制台。因此,当达到某个点时,内置浏览器编译器(Opera GX)就会停止工作。我需要某种方法在计算后立即写出这些数字,希望不会浪费时间。我怎样才能做到这一点?
(只是为了让你知道,我的实际代码将结果放在“div”元素中)
JavaScript 是单线程的。这意味着当循环运行时,无法处理事件并且页面不会响应。您可以使用“递归”setTimeout
。这会将一个长时间运行的代码分解为由事件循环管理的许多小片段。
const a = prompt();
const container = document.getElementById('container');
const f = (() => {
let i = 0;
return () => {
for (let j = 0; j < 1e9; ++j) {} // simulates long calculation
++i;
console.log(i);
container.innerText += ' ' + i;
if (i < a) setTimeout(f, 0);
};
})();
setTimeout(f, 0);
<div id="container"></div>
这不是真正的递归调用,也不会创建大型调用堆栈。setTimeout(f, 0)
将事件推入事件循环,该事件几乎立即被删除和处理。
我只是使用闭包来避免全局计数器i
。一个更简单但不太干净的版本是
const a = prompt();
const container = document.getElementById('container');
let i = 0;
function f() {
for (let j = 0; j < 1e9; ++j) {} // simulates long calculation
++i;
console.log(i);
container.innerText += ' ' + i;
if (i < a) setTimeout(f, 0);
};
setTimeout(f, 0);
<div id="container"></div>
请记住,页面在循环期间仍然没有响应(长时间计算),但现在您有许多较短的循环,而不是一个长时间运行的循环,并且事件在两个循环之间处理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)