Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 避免";“无响应脚本”;foreach循环中的消息_Javascript_Foreach - Fatal编程技术网

Javascript 避免";“无响应脚本”;foreach循环中的消息

Javascript 避免";“无响应脚本”;foreach循环中的消息,javascript,foreach,Javascript,Foreach,我正在编写一个javascript程序,其中包含一个长时间运行的foreach循环,如下所示: for (property in object) { difficultTask(); } 我已经看到,您可以使用setTimeout做一些事情,这可以让您定期将控件返回到浏览器;然而,我还没有看到任何能够用foreach循环实现这一点的方法,只有带有索引的for循环。此外,这些任务不能异步完成,因为每个迭代都依赖于上一次迭代的结果 我能想到的一个解决方案是将我的对象分割成许多较小的对象,并

我正在编写一个javascript程序,其中包含一个长时间运行的foreach循环,如下所示:

for (property in object) {
    difficultTask();
}
我已经看到,您可以使用
setTimeout
做一些事情,这可以让您定期将控件返回到浏览器;然而,我还没有看到任何能够用foreach循环实现这一点的方法,只有带有索引的for循环。此外,这些任务不能异步完成,因为每个迭代都依赖于上一次迭代的结果

我能想到的一个解决方案是将我的对象分割成许多较小的对象,并对每个对象进行迭代,在每个对象之间设置一个超时,但我想看看这是否可能,而不必求助于此


有没有一种方法可以做到这一点而不必彻底改变我拥有对象的方式?

将所有属性放入一个数组中,然后您可以使用索引变量和
setTimeout()在数组中循环:



根据长时间运行的任务所做的工作,web workers也可能是一个有趣的选项,但在IE 10之前,IE不支持它。

我认为这段代码可以实现您想要的:

function executeAndSleep(array,currentPos,step,sleepTime){
   for(var i = currentPos;i<currentPos+step&&i<array.length;i++){
      //execute your magic here
   }
   if(currentPos+step<= array.length){
       setTimeout(function(){
             executeAndSleep(array,currentPos+step,step,sleepTime);
        },sleepTime);
   }
}
函数executeAndLeep(数组、当前位置、步长、休眠时间){

对于(var i=currentPos;i,这听起来像是使用web workers的一个有用点。它们允许并发执行javascript代码。您可能想阅读。这篇文章很老(在某些方面可能已经过时),但仍然很好


浏览器支持现在就可以了。如果您需要旧IE的浏览器支持,您可以使用,这样您就可以立即开始使用web workers了。

是迭代需要一段时间,还是
困难的任务
?换句话说,您是否有天文数字的属性,或者您正在运行功能循环。如果环境如果您在supports
Object.keys
中运行代码,您可以使用它将
for…in
循环转换为
for
循环,并对其应用您以前见过的方法。@不幸的是,两者都有。您可以将代码放入web worker中。什么是“困难任务”这里?在现代计算机上,任何长时间绑定到计算机上导致浏览器警告的东西,要么是一些粒子物理实验,要么是一个坏的/糟糕的算法。@Pointy这是一个大的NLP任务啊,当然了!我也会查看web workers。这主要是针对学术CS社区的,所以我不会想象我会需要很多IE支持…@quazzieclodo-网络工作者的限制(IE支持之外)他们不能从你的主JS线程访问DOM或任何变量,所以他们只能进行独立计算。但是,如果你的需要符合这一限制,他们工作得很好。嗯……不太好。谢谢!webworkers需要IE 10,这使得大多数至少想支持IE 9的网站仍然很难依赖它。@jfriend00有足够的polyfill可用,所以这不是一个真正的问题…polyfill只是API中的一个polyfill-它实际上没有实现线程或分块,因此它无法解决OP的问题。我认为不可能有一个实现线程的polyfill。@jfriend00当然不可能实现线程化方法,但这不是必须的,我们可以实现超时切片机制来防止UI冻结。我只是指能够在所有浏览器中编写一致的代码,同时仍能获得好处的可能性。但是,如果你必须用时间切片将工作分解成块,那么web workers polyfill就不是了“不需要。我只是不明白非线程polyfill如何在任何方面帮助OP。该polyfill看起来很好,只适用于可以改善webworker体验的脚本,但不需要在webworker中。OP的代码需要进行时间切片或在实际的webworker中,它不能使用假webworker polyfill。
var props = Object.keys(object);
function executeAndSleep(array,currentPos,step,sleepTime){
   for(var i = currentPos;i<currentPos+step&&i<array.length;i++){
      //execute your magic here
   }
   if(currentPos+step<= array.length){
       setTimeout(function(){
             executeAndSleep(array,currentPos+step,step,sleepTime);
        },sleepTime);
   }
}