javascript - js在循环中 延迟执行 该如何写
PHP中文网
PHP中文网 2017-04-11 13:32:03
0
2
331

我有个excel数据,要传到服务器上
大概有1W条数据,其中有重复值
服务端写了,先查数据库中是否有这个id,如果有先删除,再写入,这样保持唯一最新数据

但是js循环上传1w条数据的时候,不会延迟设定的秒数执行.不知道哪里有错下面是我写的循环上传代码

data=list[0].data itemSend=[]; for (var i = data.length - 1; i >= 0; i--) { //这里是循环定时 上传 setTimeout(deal(i),i*1000); } function deal(i) { //这个是上传具体操作代码 console.log(i); itemSend[i]=toItem(data[i],i); toServer(itemSend[i]); }

跑起来的时候js 并没有延迟执行.不知道为什么....请大家指点一下该怎么写.是哪里写错了

PHP中文网
PHP中文网

认证高级PHP讲师

모든 응답 (2)
伊谢尔伦
for (var i = data.length - 1; i >= 0; i--) { //这里是循环定时 上传 (function(i){ setTimeout(function(){ deal(i) },i*1000); })(i); }

你看这样行不行

    Peter_Zhu

    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(); //开始执行

      최신 다운로드
      더>
      웹 효과
      웹사이트 소스 코드
      웹사이트 자료
      프론트엔드 템플릿
      회사 소개 부인 성명 Sitemap
      PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!