通常将一个任务分解成一系列子任务。如果一个函数运行时间太长,那么可以考虑查看它是否可以分解成一系列能够短时间完成的较小的函数。可将一行代码简单地看做一个原子任务,多行代码组合在一起构成一个独立任务。某些函数可基于函数调用进行拆分,例如:
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。与数组处理一样,使用此函数的前提条件:任务可以异步处理而不影响用户体验或导致依赖代码出错。