讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議120:使用定時器分解任務 >

建議120:使用定時器分解任務

通常將一個任務分解成一系列子任務。如果一個函數運行時間太長,那麼可以考慮查看它是否可以分解成一系列能夠短時間完成的較小的函數。可將一行代碼簡單地看做一個原子任務,多行代碼組合在一起構成一個獨立任務。某些函數可基於函數調用進行拆分,例如:


function saveDocument(id){

openDocument(id)

writeText(id);

closeDocument(id);

updateUI(id);

}


如果函數運行時間太長,那麼可以將它拆分成一系列更小的步驟,把獨立方法放在定時器中調用。可以將每個函數都放入一個數組,然後使用前一節中提到的數組處理模式。


function saveDocument(id){

var tasks=[openDocument,writeText,closeDocument,updateUI];

setTimeout(function{

var task=tasks.shift;

task(id);

if(tasks.length>0){

setTimeout(arguments.callee,25);

}

},25);

}


上面代碼將每個方法放入任務數組,然後在每個定時器中調用一個方法。從根本上說,現在以上方法成為數組處理模式,只有一點不同:處理函數就包含在數組項中。該模式也可封裝起來重用。


function multistep(steps,args,callback){

var tasks=steps.concat;

setTimeout(function{

var task=tasks.shift;

task.apply(null,args||);

if(tasks.length>0){

setTimeout(arguments.callee,25);

}else{

callback;

}

},25);

}


multistep函數接收3個參數:用於執行的函數數組、為每個函數提供參數的參數數組、當處理結束時調用的回調函數。函數用法如下:


function saveDocument(id){

var tasks=[openDocument,writeText,closeDocument,updateUI];

multistep(tasks,[id],function{

alert("Save completed!");

});

}


注意,傳給multistep的第二個參數必須是數組,它在創建時只包含一個id。與數組處理一樣,使用此函數的前提條件:任務可以異步處理而不影響用戶體驗或導致依賴代碼出錯。