在Google Chrome中设置JavaScript超时限制
是否可以增加JavaScript的超时限制 如果我有一个执行时间超过20/30秒的脚本,chrome将弹出一个不可还原的页面对话框在Google Chrome中设置JavaScript超时限制,javascript,google-chrome,Javascript,Google Chrome,是否可以增加JavaScript的超时限制 如果我有一个执行时间超过20/30秒的脚本,chrome将弹出一个不可还原的页面对话框 制作一个更高效的脚本对我没有帮助,因为脚本有时需要在一个函数中迭代一百万次或十亿次才能在步骤/块上拆分函数,并在setInterval(function(){})中运行这些步骤/块。 通过这种方式,页面将具有响应性,您将能够通知用户执行进度,并完成您的工作 更新:下面是一个简单的函数 worker函数执行每个迭代, chunksz-在单个块中运行的迭代次数 maxi
制作一个更高效的脚本对我没有帮助,因为脚本有时需要在一个函数中迭代一百万次或十亿次才能在步骤/块上拆分函数,并在
setInterval(function(){})中运行这些步骤/块
。
通过这种方式,页面将具有响应性,您将能够通知用户执行进度,并完成您的工作
更新:下面是一个简单的函数
worker
函数执行每个迭代,
chunksz
-在单个块中运行的迭代次数
maxit
-总迭代次数
function task(worker, chunksz, maxit)
{
var idx = 0;
var xint = null;
function exec_chunk()
{
for(var n = 0; n < chunksz; ++n)
{
if(idx >= maxit) { return; }
worker(idx++);
}
setTimeout(exec_chunk,1);
}
exec_chunk();
}
或者像这样:
task(function(i){ ... do something ... },100, 100000);
function loopBody(i){ ... do something ... }
task(loopBody,100, 100000);
当您有大量的处理要在客户端进行时,您需要将您的工作拆分为单独的线程。浏览器只有一个线程用于处理用户输入(事件)和处理JS。如果你处理了太多的JS,而没有让步,UI就会变得没有响应,浏览器也会不高兴 你怎么能让你的脚本屈服呢?新的方法是使用网络工作者。这是通过创建一个单独的线程来运行JS实现的,线程线程不访问DOM,可以并发运行 然而,这种新技术并不存在于所有浏览器中。对于较旧的浏览器,您可以通过让脚本通过超时调用自己来分割工作。每当发生超时时,脚本都会让浏览器运行其事件,一旦浏览器完成,就会触发下一个超时 示例
如果您的目标是抑制“Kill Wait”消息,作为对您缓慢的JavaScript的快速临时修复,那么解决方案是在Google Chrome中打开Tools/Developer Tools,并在浏览时将其保持在桌面某处的打开和最小化状态。我可以问一下,为什么您需要在一个函数上循环十亿次吗?我觉得这个问题的解决办法在于优化你的算法,而不是增加时间限制。我在计算得到不同牌手的机会,5张牌的可能性是2598960,我需要循环。因此,与其循环所有这些可能性,为什么不应用一些简单的统计特性/公式?你的计算似乎可以很好地利用加法、乘法和条件概率公式。我的数学不是很好,我让用户选择知道哪些卡片,以及总共有多少张卡片。啊,我明白了。如果你想让很多人使用这个,你肯定应该对数学方法做一些研究,因为它们会更有效,使用lass hack,提供更好的整体体验。也许这一页对你有用:请看我自己答案的注释,我需要按正确的顺序循环,所以我不能使用“setInterval(function(){})”,但我在计算开始时使用它。@Tyilo:你必须发布一些有用的东西。。。你发布的内容没有任何作用,你知道的,缺少全球信息。如果你的函数太复杂,你应该创建一个缩减并发布它。请记录您的代码,如果需要花太多的时间来理解,我无法帮助您。@Tyilo,我尝试了一些东西,仍然不清楚您的函数应该做什么,但基本上,您需要调用带有超时的递归函数。因为我不知道你的函数应该做什么,我不知道这个行为是否受到了影响。测试一下,顺便告诉我有什么问题,我想添加@Juan Mendes会让它通知用户他们对某条评论感兴趣。@Tyilo:有趣的家伙,你的函数对我来说没有意义,我知道它没有产生相同的结果,但我不会花时间调试为什么没有。如果你正确地记录了你的函数应该做什么,也许我可以改变更多的逻辑来获得正确的结果。在任何情况下,该示例都可以让您充分了解如何使用timeouts@Tyilo:顺便说一句,全局递归听起来很错误
function loopBody(i){ ... do something ... }
task(loopBody,100, 100000);
var list = [];
for (var i = 0; i < 500000; i++) {
list.push(Math.random());
}
function sumOfSquares(list) {
var total = 0;
for (var i = 0; i < list.length; i++) {
total += list[i] * list[i];
// DOM manipulation to make it take longer
var node = document.createElement("div");
node.innerHTML = "Sync temp value = " + total;
document.body.appendChild(node);
}
return total;
}
function sumOfSquaresAsync(arr, callback) {
var chunkSize = 1000; // Do 1000 at a time
var arrLen = arr.length;
var index = 0;
var total = 0;
nextStep();
function nextStep() {
var step = 0;
while (step < chunkSize && index < arrLen) {
total += arr[index] * arr[index];
// DOM manipulation to make it take longer
var node = document.createElement("div");
node.innerHTML = "Async temp value = " + total;
document.body.appendChild(node);
index++;
step++;
}
if (index < arrLen) {
setTimeout(nextStep, 10);
} else {
callback(total);
}
}
}
sumOfSquaresAsync(list, function(total) {console.log("Async Result: " + total)});
//console.log("Sync result" + sumOfSquares(list));
/**
* @param {function} worker. It is passed two values, the current array index,
* and the item at that index
* @param {array} list Items to be traversed
* @param {callback} The function to call when iteration is finished;
* @param {number} maxit The number of iterations of the loop to run
* before yielding, defaults to 1000
*/
function task(worker, list, callback, maxit)
{
maxit = maxit || 1000;
var idx = 0;
exec_chunk();
function exec_chunk()
{
for(var n = 0; n < maxit; ++n)
{
if(idx >= list.length) {
callback();
return;
}
worker(idx, list[idx]);
idx++;
}
setTimeout(exec_chunk,1);
}
}
function sumOfSquaresAsync(list, callback)
{
var total = 0;
// The function that does the adding and squaring
function squareAndAdd(index, item) {
total += item * item;
// DOM manipulation to make it take longer and to see progress
var node = document.createElement("div");
node.innerHTML = "Async temp value = " + total;
document.body.appendChild(node);
}
// Let the caller know what the result is when iteration is finished
function onFinish() {
callback(total);
}
task(squareAndAdd, list, onFinish);
}
var list = [];
for (var i = 0; i < 100000; i++) {
list.push(Math.random());
}
sumOfSquaresAsync(list, function(total) {
console.log("Sum of Squares is " + total);
})