setTimeout 对题主理解造成了影响,重新写了一个demo。 //老规则,为了方便复制,TaskControl 再写一遍 //创建任务控制类 var TaskControl = function(taskFunction, finishFunction){ this.finish = false; this.next = function(){ if( !this.finish ){ taskFunction.call(this); }else{ finishFunction.call(this); } }; }; //老规则,为了方便复制,TaskControl 再写一遍:结束 //任务 var task = function(){ this.index++; //判断列表中还有没有任务 if( this.index >= this.data.length ){ this.finish = true; //继续下一个,触发完成 this.next(); }else{ console.time("任务:" + this.index); //如果还有任务,开始处理任务 this.cache.push({ url : "/q/" + this.data[this.index], index : this.index, start : new Date() }); $.get(this.cache[this.index].url, (function(html){ this.cache[this.index].finish = new Date(); this.cache[this.index].htmlsize = html.length; console.log(this.cache[this.index]); console.timeEnd("任务:" + this.index); //继续下一个 this.next(); }).bind(this)); } }; var finish = function(){ console.log("任务完成"); console.table(this.cache); }; var run = new TaskControl(task, finish); //为了测试方便,将数据也绑定过来 run.data = ["1010000007271957", "1010000003115114", "1010000007271957"];//列表 run.index = -1; //默认索引 run.cache = []; //设置个执行缓存 run.next(); //开始执行 以下是老答案 使用setTimeout。 您确定 1秒内能执行完吗?(如果执行不完,接着多任务执行,CPU过高) 您确定 1秒内执行不完吗?(0.1秒能完成,干嘛每次都要等一秒) 为什么 导入完 一个任务后,接着再执行 下一个导入任务,而不是靠猜测,去 隔 一秒 执行一次呢? 不用担心无尽的callback,一个简单的控制类,就可以完成这么简单的工做,参考了Promise的思想。 //创建任务控制类 var TaskControl = function(taskFunction, finishFunction){ this.finish = false; this.next = function(){ if( !this.finish ){ taskFunction.call(this); }else{ finishFunction.call(this); } }; }; 完成的简单的代码 //为了方便复制,TaskControl 再写一遍 //创建任务控制类 var TaskControl = function(taskFunction, finishFunction){ this.finish = false; this.next = function(){ if( !this.finish ){ taskFunction.call(this); }else{ finishFunction.call(this); } }; }; //为了方便复制,TaskControl 再写一遍:结束 //任务 var task = function(){ //deal不知道你怎么定义的,估计是异步的,这里用setTimeout实现 var deal = function(){ //异步执行了 this.index++; console.time("任务:" + this.index); //判断列表中还有没有任务 if( this.index >= this.data.length ){ //设置 finish 为 true this.finish = true; }else{ //如果还有任务,开始处理任务 var runLog = { "时间" : new Date(), "索引" : this.index, "值" : this.data[this.index] }; console.log(runLog); //每次执行日志 this.cache.push(runLog); } console.timeEnd("任务:" + this.index); //继续下一个 this.next(); }.bind(this); //setTimeout 是为了模仿异步的效果,随时 时间完成 setTimeout(deal, parseInt(Math.random() * 1000)); }; var finish = function(){ console.log("任务完成"); console.table(this.cache); }; var run = new TaskControl(task, finish); //为了测试方便,将数据也绑定过来 run.data = ["任务开始倒计时" ,"10", "9", "0", "开始了吗?", "还没结束吗?", "列表中最后一个任务!"]; //列表 run.index = -1; //默认索引 run.cache = []; //设置个执行缓存 run.next(); //开始执行