Yielding Processes

Yielding Processes
运行在浏览器中的JavaScript都分配了一个确定数量的资源。不同于桌面应用往往能随意控制它们想要的内存大小和处理时间,JavaScript被限制了,以防恶意的Web程序员把计算机搞挂了。
其中一个限制是长时间运行脚本的制约,如果代码运行超过特定的时间或者特定语句数量就不让它继续执行。如果达到了这个限制,就会弹出一个浏览器错误的对话框,告诉用户某个脚本会用过长的时间执行,询问是否继续执行它还是停止它。所有开发人员的目的就是让用户不要看到这令人费解的对话框,定时器是绕开此限制的方法之一。

脚本长时间运行的问题通常是由两个原因之一造成的:

  1. 过长的、过深的嵌套的函数调用。
  2. 大量进行处理的循环。

后者是较为容易解决的问题,长时间运行的循环通常遵循以下模式:

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);

数组分块的重要性在于:它可以将多个项目的处理在执行队列上分开,在每个项目处理之后,给予其他的浏览器处理机会运行,这样就可以避免长时间运行脚本的错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值