在Google Chrome中设置JavaScript超时限制

在Google Chrome中设置JavaScript超时限制,javascript,google-chrome,Javascript,Google Chrome,是否可以增加JavaScript的超时限制 如果我有一个执行时间超过20/30秒的脚本,chrome将弹出一个不可还原的页面对话框 制作一个更高效的脚本对我没有帮助,因为脚本有时需要在一个函数中迭代一百万次或十亿次才能在步骤/块上拆分函数,并在setInterval(function(){})中运行这些步骤/块。 通过这种方式,页面将具有响应性,您将能够通知用户执行进度,并完成您的工作 更新:下面是一个简单的函数 worker函数执行每个迭代, chunksz-在单个块中运行的迭代次数 maxi

是否可以增加JavaScript的超时限制

如果我有一个执行时间超过20/30秒的脚本,chrome将弹出一个不可还原的页面对话框


制作一个更高效的脚本对我没有帮助,因为脚本有时需要在一个函数中迭代一百万次或十亿次

才能在步骤/块上拆分函数,并在
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);        
})