先看正常普通的循环
var arr = [.........];
for (var i = 0;i < arr.length; i++) {
process(arr[i],i);
}
上面语句是将arr数组内容读取出来交给process函数进行处理,但是如果process函数运行过慢的话arr循环次数又多导致执行时间过长浏览器就会处于假死状态。
下面利用setTimeout和arguments.callee变相代替循环来达到异步的执行process内容的目的,虽然执行时间上不会少。。
function asynArr(arr,process){
var i=0,len = arr.length;
setTimeout(function(){
process(arr[i] , i);
i++;
if( i < len ){
setTimeout(arguments.callee,10);
}
});
}
setTimeout 隔一段时间执行,仅执行一次。
arguments.callee 返回正在被执行函数对象,即
function(){
process(arr[i] , i);
i++;
if( i < len ){
setTimeout(arguments.callee,10);
}
这样上面的asynArr方法就能达到循环和异步执行process的内容的效果。
下面一个方法可以加上正常的循环每次setTimeout处理多几个数组的内容,虽然可能没什么用。
function asynArr(arr,process,count){
var i=0,len = arr.length,j=count;
if(!count) count = 1;
if(j>len) j = len;
setTimeout(function(){
for (;i < j; i++) {
process(arr[i],i);
}
j = j+count;
if(j>len) j = len;
if(i
setTimeout(arguments.callee,1)
}
});
}