JS循環異步調用

先看正常普通的循環javascript

var arr = [.........];
for (var i = 0;i < arr.length; i++) {
     process(arr[i],i);
}

上面語句是將arr數組內容讀取出來交給process函數進行處理,可是若是process函數運行過慢的話arr循環次數又多致使執行時間過長瀏覽器就會處於假死狀態。java

下面利用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處理多幾個數組的內容,雖然可能沒什麼用。code

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<len){
            	 setTimeout(arguments.callee,1)
             }
	    });
}
相關文章
相關標籤/搜索