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 相关文章推荐
ExtJS4 Grid改变单元格背景颜色及Column render学习
Feb 06 Javascript
JS在TextArea光标位置插入文字并实现移动光标到文字末尾
Jun 21 Javascript
JavaScript对内存分配及管理机制详细解析
Nov 11 Javascript
js点击文本框弹出可选择的checkbox复选框
Feb 03 Javascript
使用node.js中的Buffer类处理二进制数据的方法
Nov 26 Javascript
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
Dec 14 Javascript
JavaScript实现经典排序算法之选择排序
Dec 28 Javascript
JS 实现随机验证码功能
Feb 15 Javascript
利用babel将es6语法转es5的简单示例
Dec 01 Javascript
关于vue单文件中引用路径的处理方法
Jan 08 Javascript
小程序关于请求同步的总结
May 05 Javascript
一文彻底理解js原生语法prototype,__proto__和constructor
Oct 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 文件上传进度条的两种实现方法的代码
2007/11/25 PHP
php mysql数据库操作分页类
2008/06/04 PHP
JSON在PHP中的应用介绍
2012/09/08 PHP
php猴子选大王问题解决方法
2015/05/12 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
2016/06/13 PHP
PHP支付系统设计与典型案例分享
2016/08/02 PHP
php通过各种函数判断0和空
2020/07/04 PHP
nicejforms——美化表单不用愁
2007/02/20 Javascript
用javascript作一个通用向导说明
2011/08/30 Javascript
批量修改标签css样式以input标签为例
2014/07/31 Javascript
JS控制网页动态生成任意行列数表格的方法
2015/03/09 Javascript
jQuery遮罩层实现方法实例详解(附遮罩层插件)
2015/12/08 Javascript
JS原型继承四步曲及原型继承图一览
2017/11/28 Javascript
Vue.js组件高级特性实例详解
2018/12/24 Javascript
微信小程序授权登陆及每次检查是否授权实例代码
2019/09/18 Javascript
Ant Design的Table组件去除
2020/10/24 Javascript
[05:23]DOTA2-DPC中国联赛2月1日Recap集锦
2021/03/11 DOTA
Python中除法使用的注意事项
2014/08/21 Python
利用python写个下载teahour音频的小脚本
2017/05/08 Python
简单了解OpenCV是个什么东西
2017/11/10 Python
Python基于socket模块实现UDP通信功能示例
2018/04/10 Python
python获取网络图片方法及整理过程详解
2019/12/20 Python
pytorch ImageFolder的覆写实例
2020/02/20 Python
Python异常原理及异常捕捉实现过程解析
2020/03/25 Python
如何在vscode中安装python库的方法步骤
2021/01/06 Python
体验完美剃须:The Art of Shaving
2018/08/06 全球购物
小学校园活动策划
2014/01/30 职场文书
小学生秋游活动方案
2014/02/23 职场文书
有兼职工作经历的简历自我评价
2014/03/07 职场文书
网站美工岗位职责
2014/04/02 职场文书
高中生家长寄语大全
2014/04/03 职场文书
12.4全国法制宣传日活动方案
2014/11/02 职场文书
实习指导教师评语
2014/12/30 职场文书
乒乓球比赛通知
2015/04/27 职场文书
MongoDB支持的数据类型
2022/04/11 MongoDB
Python sklearn分类决策树方法详解
2022/09/23 Python