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 相关文章推荐
模拟一个类似百度google的模糊搜索下拉列表
Apr 15 Javascript
jQuery幻灯片带缩略图轮播效果代码分享
Aug 17 Javascript
javascript模拟C#格式化字符串
Aug 26 Javascript
谈谈JavaScript中的几种借用方法
Aug 09 Javascript
基于Javascript实现的不重复ID的生成器
Dec 25 Javascript
详解Vue中过度动画效果应用
May 25 Javascript
Vue中的数据监听和数据交互案例解析
Jul 12 Javascript
详解JS数值Number类型
Feb 07 Javascript
详解ECMAScript typeof用法
Jul 25 Javascript
bootstrap下拉框动态赋值方法
Aug 10 Javascript
vscode 开发Vue项目的方法步骤
Nov 25 Javascript
node读写Excel操作实例分析
Nov 06 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
一个连接两个不同MYSQL数据库的PHP程序
2006/10/09 PHP
PHP 采集心得技巧
2009/05/15 PHP
PHP 高级课程笔记 面向对象
2009/06/21 PHP
PHP函数常用用法小结
2010/02/08 PHP
使用PHP生成二维码的两种方法(带logo图像)
2014/03/14 PHP
codeigniter集成ucenter1.6双向通信的解决办法
2014/06/12 PHP
php实现的支持断点续传的文件下载类
2014/09/23 PHP
PHP中error_log()函数的使用方法
2015/01/20 PHP
yii2.0实现创建简单widgets示例
2016/07/18 PHP
在JavaScript中遭遇级联表达式陷阱
2007/03/08 Javascript
Add Formatted Text to a Word Document
2007/06/15 Javascript
[原创]js获取数组任意个不重复的随机数组元素
2010/03/15 Javascript
JS 如果改变span标签的是否隐藏属性
2011/10/06 Javascript
JS代码放在head和body中的区别分析
2011/12/01 Javascript
40款非常有用的 jQuery 插件推荐(系列一)
2011/12/21 Javascript
js实现连续英文字符自动换行兼容ie6 ie7和firefox
2013/09/06 Javascript
jquery实现网页查找功能示例分享
2014/02/12 Javascript
js树插件zTree获取所有选中节点数据的方法
2015/01/28 Javascript
JavaScript里实用的原生API汇总
2015/05/14 Javascript
jQuery实现的类似淘宝网站搜索框样式代码分享
2015/08/24 Javascript
JavaScript字符串常用的方法
2016/03/10 Javascript
Web前端开发工具——bower依赖包管理工具
2016/03/29 Javascript
js动态获取子复选项并设计全选及提交的实现方法
2016/06/24 Javascript
vue+vuex+axios+echarts画一个动态更新的中国地图的方法
2017/12/19 Javascript
vue中简单弹框dialog的实现方法
2018/02/26 Javascript
node微信开发之获取access_token+自定义菜单
2019/03/17 Javascript
vue动态渲染svg、添加点击事件的实现
2020/03/13 Javascript
javascript设计模式 ? 策略模式原理与用法实例分析
2020/04/21 Javascript
Python实现拼接多张图片的方法
2014/12/01 Python
python实现朴素贝叶斯分类器
2018/03/28 Python
在tensorflow中实现去除不足一个batch的数据
2020/01/20 Python
Happy Plugs官网:瑞典无线耳机品牌
2020/07/16 全球购物
如何获取某个日期是当月的最后一天
2013/12/05 面试题
财务总监管理岗位职责
2014/03/08 职场文书
《绝招》教学反思
2016/02/20 职场文书
2019年行政人事个人工作总结范本!
2019/07/19 职场文书