Yielding Processes
运行在浏览器中的JavaScript都分配了一个确定数量的资源。不同于桌面应用往往能随意控制它们想要的内存大小和处理时间,JavaScript被限制了,以防恶意的Web程序员把计算机搞挂了。
其中一个限制是长时间运行脚本的制约,如果代码运行超过特定的时间或者特定语句数量就不让它继续执行。如果达到了这个限制,就会弹出一个浏览器错误的对话框,告诉用户某个脚本会用过长的时间执行,询问是否继续执行它还是停止它。所有开发人员的目的就是让用户不要看到这令人费解的对话框,定时器是绕开此限制的方法之一。
脚本长时间运行的问题通常是由两个原因之一造成的:
- 过长的、过深的嵌套的函数调用。
- 大量进行处理的循环。
后者是较为容易解决的问题,长时间运行的循环通常遵循以下模式:
for(var i=0;i<data.length;i++){
process(data[i]);
}
为了解决上面这个问题,需要数组分块的技术,小块小块的处理数组,通常每次一小块。基本思路是:要为处理的项目创建一个队列,然后用定时器取出下一个要处理的项目进行处理,接着再设置一个定时器。示例如下:
function chunk(array,process,context){
setTimeout(function(){
var item = array.shift();
process.call(context,item);
if(array.length>0){
setTimeout(arguments.callee,100);
}
},100)
}
var data = [12,123,1234,453,436,23,23,5,4123,45,346,5634,2234,345,342];
function printValue(item){
var root = document.getElementById('root');
root.innerHTML += item + '<br/>';
}
chunk(data,printValue);
数组分块的重要性在于:它可以将多个项目的处理在执行队列上分开,在每个项目处理之后,给予其他的浏览器处理机会运行,这样就可以避免长时间运行脚本的错误。
转载自原文链接, 如需删除请联系管理员。
原文链接:Yielding Processes,转载请注明来源!