js中setTimeout的妙用--防止循环超时


Posted in Javascript onMarch 06, 2017

上个周日,介绍了如何使用setTimeout代替setInterval进行间歇调用,这个周日,继续来讲《JavaScript高级程序设计》这本书里面,对于setTimeout的另一种妙用——防止循环超时

 【这是铺垫,为故事的高潮埋下伏笔】

JS是单线程的,一个代码块里面的代码,只能按顺序从上到下执行,所以如果中间有一块代码,执行起来非常耗时,就会导致下面的代码无法执行,出现浏览器假死的状态。

JS的耗时操作,常见的有两种  1.向服务器发起请求   2.对数组的循环操作  (当然,还有一种,就是把1和2合在一起,叫做  在循环操作里面向服务器发出请求,哈哈哈,实际项目里面经常有人这么干)

解决这两种耗时操作的思路都是一样的——异步编程。JS的异步编程,并不是多线程,因为正如上面所说的,JS是单线程的。JS的异步,直观上的理解,就是延时和回调

对于第一种耗时情况,我们采用的是ajax异步请求,待耗时的请求返回结果时,进行回调操作。

对于第二种耗时情况,则可以使用本文即将介绍的方法,setTimeout延时调用,进行数组分块处理

【这才是高潮】

假设我们要处理一个大小为100的数组,对于数组中每个元素,都需要执行大量的处理,每个元素大约需要1s的处理时间;

并且我们认为,程序后面的代码,不会依赖于我们对这个数组的处理结果。

于是就有了下面这段代码,以两种方式来处理这个数组,一种是常规方式,一种是setTImeout的数组分块处理

var processTime = 0;
//常规操作
tcCircle();
//注释上面的代码 放开下面注释 以执行setTimeout数组分块操作
//tcCircleUseSetTimeout();
//time consuming circle
function tcCircle(){
  var arr = new Array(100);
  for(var i=0;i<arr.length;i++){
    process(arr[i]);
  }
  //页面标题栏一直转圈 且下面的语句迟迟无法执行
  console.log("important process");
  console.log("finish!");
}
function tcCircleUseSetTimeout(){
  var arr = new Array(100);
  setTimeout(function(){
    var ele = arr.shift();
    process(ele);
    if(arr.length>0){
      setTimeout(arguments.callee,100);
    }
  },100);
  console.log("important process");
  console.log("finish!");
}
function process(ele){
  console.log("process"+(++processTime));
  //模拟长时间的处理过程
  sleep(1000);
}
function sleep(sleepTime){
  var start=new Date().getTime();
  while(true){
    if(new Date().getTime()-start>sleepTime){
      break;  
    }
  }
}

首先我们执行常规的操作,由于是单线程,可想而知,执行完这段程序,至少要 1*100 = 100s,并且浏览器会出现假死

js中setTimeout的妙用--防止循环超时

然后我们执行setTimeout方式的方法,setTImeout的方式,我们每次只操作数组里面的一个对象,并且在每次操作之间,设置了100ms的延时,供js引擎执行主干的代码,因此,很明显,执行的效果非常棒!

js中setTimeout的妙用--防止循环超时

我们看到,不仅浏览器的标题栏不会转菊花了,控制台也很快就打印出 我们在代码最后面打印的语句,说明主干程序已经走完,数组的处理则定时执行着。

通过这样的优化,我们的程序给用户的体验提示了许多,当然,这里只是书中介绍的一种方法,我相信还有很多其他实现方式,比如我现在可以想到的就有promise,有机会我会补充一下,大家也可以畅所欲言,看看有什么其他更好的方法来对付这种循环耗时操作!

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
jquery 弹出层实现代码
Oct 30 Javascript
基于jQuery的获得各种控件Value的方法
Nov 19 Javascript
JavaScript表达式:URL 协议介绍
Mar 10 Javascript
javascript实现点击按钮让DIV层弹性移动的方法
Feb 24 Javascript
jQuery实现的跨容器无缝拖动效果代码
Jun 21 Javascript
JS及JQuery对Html内容编码,Html转义
Feb 17 Javascript
JavaScript中值类型和引用类型的区别
Feb 23 Javascript
移动端利用H5实现压缩图片上传功能
Mar 29 Javascript
vue写一个组件
Apr 09 Javascript
JS面向对象之多选框实现
Jan 17 Javascript
JavaScript 异步时序问题
Nov 20 Javascript
js实现抽奖功能
Nov 24 Javascript
Bootstrap表单简单实现代码
Mar 06 #Javascript
微信小程序scroll-view实现横向滚动和上拉加载示例
Mar 06 #Javascript
Js自动截取字符串长度,添加省略号(……)的实现方法
Mar 06 #Javascript
Bootstrap显示与隐藏简单实现代码
Mar 06 #Javascript
jQuery时间验证和转换为标准格式的时间格式
Mar 06 #Javascript
Bootstrap导航中表单简单实现代码
Mar 06 #Javascript
基于JS实现仿百度百家主页的轮播图效果
Mar 06 #Javascript
You might like
将一维或多维的数组连接成一个字符串的php代码
2010/08/08 PHP
PHP中几个可以提高运行效率的代码写法、技巧分享
2014/08/21 PHP
php可应用于面包屑导航的递归寻找家谱树实现方法
2015/02/02 PHP
Laravel框架中队列和工作(Queues、Jobs)操作实例详解
2020/04/06 PHP
学习YUI.Ext第五日--做拖放Darg&amp;Drop
2007/03/10 Javascript
利用ASP发送和接收XML数据的处理方法与代码
2007/11/13 Javascript
js调用flash的效果代码
2008/04/26 Javascript
js 格式化时间日期函数小结
2010/03/20 Javascript
js与css实现弹出层覆盖整个页面的方法
2014/12/13 Javascript
AngularJS语法详解
2015/01/23 Javascript
AspNet中使用JQuery boxy插件的确认框
2015/05/20 Javascript
JS递归遍历对象获得Value值方法技巧
2016/06/14 Javascript
jQuery实用小技巧_输入框文字获取和失去焦点的简单实例
2016/08/25 Javascript
Angular.JS去掉访问路径URL中的#号详解
2017/03/30 Javascript
nodejs爬虫遇到的乱码问题汇总
2017/04/07 NodeJs
Vue中如何实现proxy代理
2018/04/20 Javascript
详解Vue中的Props与Data细微差别
2020/03/02 Javascript
微信小程序实现上传照片代码实例解析
2020/08/04 Javascript
解决elementui表格操作列自适应列宽
2020/12/28 Javascript
python re模块findall()函数实例解析
2018/01/19 Python
Python字符串格式化%s%d%f详解
2018/02/02 Python
对python3中pathlib库的Path类的使用详解
2018/10/14 Python
Linux下安装python3.6和第三方库的教程详解
2018/11/09 Python
Pandas Shift函数的基础入门学习笔记
2018/11/16 Python
python实现简单日志记录库glog的使用
2019/12/13 Python
详解python安装matplotlib库三种失败情况
2020/07/28 Python
Python过滤序列元素的方法
2020/07/31 Python
施华洛世奇澳大利亚官网:SWAROVSKI澳大利亚
2017/01/06 全球购物
美国打印机墨水和碳粉购物网站:QuikShip Toner
2018/08/29 全球购物
Hawes & Curtis澳大利亚官网:英国经典服饰品牌
2018/10/29 全球购物
若干个Java基础面试题
2015/05/19 面试题
教师群众路线剖析材料
2014/09/29 职场文书
2015年办公室文秘工作总结
2015/04/30 职场文书
一百条裙子读书笔记
2015/07/01 职场文书
2016年社会管理综治宣传月活动总结
2016/03/16 职场文书
使用css样式设计一个简单的html登陆界面的实现
2021/03/30 HTML / CSS