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 相关文章推荐
JQUERY1.6 使用方法四 检测浏览器
Nov 23 Javascript
JSP跨iframe如何传递参数实现代码
Sep 21 Javascript
一些老手都不一定知道的JavaScript技巧
May 06 Javascript
js实现键盘上下左右键选择文字并显示在文本框的方法
May 07 Javascript
JS实现在状态栏显示打字效果完整实例
Nov 02 Javascript
JavaScript代码实现左右上下自动晃动自动移动
Apr 08 Javascript
使用JS读取XML文件的方法
Nov 25 Javascript
jQuery控制元素隐藏和显示
Mar 03 Javascript
Node.js通过身份证号验证年龄、出生日期与性别方法示例
Mar 09 Javascript
快速处理vue渲染前的显示问题
Mar 05 Javascript
vue实现lodop打印功能的示例
Nov 11 Javascript
JS中如何优雅的使用async await详解
Oct 05 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递归创建和删除文件夹的代码小结
2012/04/13 PHP
php 定义404页面的实现代码
2012/11/19 PHP
php 批量查询搜狗sogou代码分享
2015/05/17 PHP
基于JQuery 的消息提示框效果代码
2011/07/31 Javascript
Json2Template.js 基于jquery的插件 绑定JavaScript对象到Html模板中
2011/10/29 Javascript
使用按钮控制以何种方式打开新窗口的属性介绍
2012/12/17 Javascript
代码触发js事件(click、change)示例应用
2013/12/13 Javascript
js实现touch移动触屏滑动事件
2015/04/17 Javascript
Jquery中的$.each获取各种返回类型数据的使用方法
2015/05/03 Javascript
《JavaScript高级编程》学习笔记之object和array引用类型
2015/11/01 Javascript
NodeJs的优势和适合开发的程序
2016/08/14 NodeJs
Js查找字符串中出现次数最多的字符及个数实例解析
2016/09/05 Javascript
JS函数多个参数默认值指定方法分析
2016/11/28 Javascript
Vuex中mutations与actions的区别详解
2018/03/01 Javascript
微信小程序功能之全屏滚动效果的实现代码
2018/11/22 Javascript
基于element-ui组件手动实现单选和上传功能
2018/12/06 Javascript
手挽手带你学React之React-router4.x的使用
2019/02/14 Javascript
利用Node.js如何实现文件循环覆写
2019/04/05 Javascript
详解js中的几种常用设计模式
2020/07/16 Javascript
vant picker+popup 自定义三级联动案例
2020/11/04 Javascript
python基础教程之元组操作使用详解
2014/03/25 Python
初步探究Python程序的执行原理
2015/04/11 Python
python 哈希表实现简单python字典代码实例
2019/09/27 Python
pyCharm 实现关闭代码检查
2020/06/09 Python
HTML5自定义mp3播放器源码
2020/01/06 HTML / CSS
澳大利亚首个在线预订旅游网站:Wotif
2017/07/19 全球购物
营销与策划个人求职信
2013/09/22 职场文书
《赵州桥》教学反思
2014/02/17 职场文书
社区工作感言
2014/02/21 职场文书
市场营销专业自荐书
2014/06/10 职场文书
商务经理岗位职责
2014/07/30 职场文书
群众路线剖析材料(四风)
2014/11/05 职场文书
期末考试复习计划
2015/01/19 职场文书
公司岗位说明书
2015/10/08 职场文书
关于保护环境的建议书
2019/06/24 职场文书
python爬虫selenium模块详解
2021/03/30 Python