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 相关文章推荐
IE8 原生JSON支持
Apr 13 Javascript
JavaScript学习笔记(一) js基本语法
Oct 25 Javascript
javascript面向对象程序设计(一)
Jan 29 Javascript
angularJS中router的使用指南
Feb 09 Javascript
require、backbone等重构手机图片查看器
Nov 17 Javascript
深入学习 JavaScript中的函数调用
Mar 23 Javascript
微信小程序 跳转传递数据的实例
Jul 06 Javascript
在一般处理程序(ashx)中弹出js提示语
Aug 16 Javascript
微信小程序自定义prompt组件步骤详解
Jun 12 Javascript
VUE 配置vue-devtools调试工具及安装方法
Sep 30 Javascript
jQuery实现ajax的嵌套请求案例分析
Feb 16 jQuery
关于element-ui的隐藏组件el-scrollbar的使用
May 29 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
ThinkPHP3.1数据CURD操作快速入门
2014/06/19 PHP
PHP Opcache安装和配置方法介绍
2015/05/28 PHP
PHP6新特性分析
2016/03/03 PHP
浅谈PHP SHA1withRSA加密生成签名及验签
2019/03/18 PHP
基于JQuery制作的产品广告效果
2010/12/08 Javascript
跟我学Nodejs(二)--- Node.js事件模块
2014/05/21 NodeJs
JS循环遍历JSON数据的方法
2014/07/08 Javascript
Egret引擎开发指南之编译项目
2014/09/03 Javascript
js实现不重复导入的方法
2016/03/02 Javascript
JS+CSS3实现超炫的散列画廊特效
2016/07/16 Javascript
Angular Module声明和获取重载实例代码
2016/09/14 Javascript
利用angular.copy取消变量的双向绑定与解析
2016/11/25 Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
2016/12/27 Javascript
jQuery UI Grid 模态框中的表格实例代码
2017/04/01 jQuery
vue2.0中goods选购栏滚动算法的实现代码
2017/05/17 Javascript
vue裁切预览组件功能的实现步骤
2018/05/04 Javascript
vue+Vue Router多级侧导航切换路由(页面)的实现代码
2018/12/20 Javascript
JavaScript, select标签元素左右移动功能实现
2020/05/14 Javascript
python通过BF算法实现关键词匹配的方法
2015/03/13 Python
在Python程序中实现分布式进程的教程
2015/04/28 Python
python实现爬虫下载美女图片
2015/07/14 Python
教大家玩转Python字符串处理的七种技巧
2017/03/31 Python
使用PM2+nginx部署python项目的方法示例
2018/11/07 Python
关于python导入模块import与常见的模块详解
2019/08/28 Python
python利用xlsxwriter模块 操作 Excel
2020/10/14 Python
CSS3实现自定义Checkbox特效实例代码
2017/04/24 HTML / CSS
澳大利亚窗帘商店:Curtain Wonderland
2019/12/01 全球购物
餐厅经理岗位职责和岗位目标
2014/02/13 职场文书
初中升旗仪式演讲稿
2014/05/08 职场文书
民间借贷借条范本
2015/05/25 职场文书
学校学期工作总结
2015/08/13 职场文书
趣味运动会广播稿
2015/08/19 职场文书
详解CSS玩转图片Base64编码
2021/05/25 HTML / CSS
MySQL系列之九 mysql查询缓存及索引
2021/07/02 MySQL
详细聊聊浏览器是如何看闭包的
2021/11/11 Javascript
剖析后OpLog订阅MongoDB的数据变更就没那么难了
2022/02/24 MongoDB