javascript引擎长时间独占线程造成卡顿的解决方案


Posted in Javascript onDecember 03, 2014

Javascript 引擎的单线程特性使得在处理一个较大的循环遍历时会长时间独占线程,导致其它事件(例如用户操作)无法及时响应,严重时造成卡顿甚至是假死现象。为解决上述问题,一种可行机制是将大的循环拆分成若干小的循环片段分片执行,使得Javascript 引擎有时机在各段之间插入执行其它事情,从而有效改善性能体验

Ansync.js

function Ansync (totalCount, segmentCount, workCallback, returnCallback)

{

    var num_of_item_for_each_segment = segmentCount;

    var num_of_segment = Math.ceil(totalCount / num_of_item_for_each_segment);

    var count_of_segment = 0;

    var timer;

    var start, end;

    this.process = function(scope, timeout)

    {

        if (scope != undefined)

        {

            workCallback = workCallback.bind(scope);

            returnCallback = returnCallback ? returnCallback.bind(scope) : undefined;

        }

        if (count_of_segment == num_of_segment)

        {

            clearTimeout(timer);

            if (returnCallback != undefined)

                returnCallback();

        }

        else

        {

            start = count_of_segment * num_of_item_for_each_segment;

            end = Math.min(totalCount, (count_of_segment + 1) * num_of_item_for_each_segment);

            if (num_of_segment == 1)//needn't create timer

            {

                workCallback(start, end);

                count_of_segment = 1;

                this.process();

            }

            else

            {

                timer = setTimeout(function ansyncTimeout(){

                    if (workCallback(start, end)) //finish process if function returns true

                    {

                        count_of_segment = num_of_segment;

                    }

                    else

                    {

                        count_of_segment++;

                    }

                    this.scope.process();

                }.bind({scope: this}),timeout == undefined ? Ansync.TimeOut : timeout);

            }

        }

    }

}

Ansync.TimeOut = 5;

方法很简单,但是很实用,有相同项目需求的小伙伴参考下吧

Javascript 相关文章推荐
ExtJS TabPanel beforeremove beforeclose使用说明
Mar 31 Javascript
谈谈JavaScript中的函数与闭包
Apr 14 Javascript
javascript禁用Tab键脚本实例
Nov 22 Javascript
jQuery学习笔记之基础中的基础
Jan 19 Javascript
jQuery+CSS实现的网页二级下滑菜单效果
Aug 25 Javascript
JavaScript控制浏览器全屏及各种浏览器全屏模式的方法、属性和事件
Dec 20 Javascript
gulp-htmlmin压缩html的gulp插件实例代码
Jun 06 Javascript
15款最好的Bootstrap在线编辑器
Aug 03 Javascript
jquery横向纵向鼠标滚轮全屏切换
Feb 27 Javascript
Vue ElementUI之Form表单验证遇到的问题
Aug 21 Javascript
JS实现可控制的进度条
Mar 25 Javascript
js实现简单的贪吃蛇游戏
Apr 23 Javascript
javascript中clone对象详解
Dec 03 #Javascript
javascript使用正则表达式检测IP地址
Dec 03 #Javascript
Javascript快速排序算法详解
Dec 03 #Javascript
Javascript冒泡排序算法详解
Dec 03 #Javascript
Javascript堆排序算法详解
Dec 03 #Javascript
node.js下when.js 的异步编程实践
Dec 03 #Javascript
jquery操作 iframe的方法
Dec 03 #Javascript
You might like
解析strtr函数的效率问题
2013/06/26 PHP
ThinkPHP模板标签eq if 中区分0,null,false的方法
2017/03/24 PHP
PHP读取目录树的实现方法分析
2019/03/22 PHP
XP折叠菜单&仿QQ2006菜单
2006/12/16 Javascript
js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
2011/12/20 Javascript
深入理解JavaScript系列(2) 揭秘命名函数表达式
2012/01/15 Javascript
如何让页面在打开时自动刷新一次让图片全部显示
2012/12/17 Javascript
JQuery仿小米手机抢购页面倒计时效果
2014/12/16 Javascript
使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
2016/03/22 Javascript
详解基于webpack和vue.js搭建开发环境
2017/04/05 Javascript
JavaScript字符串转数字的5种方法及遇到的坑
2018/07/16 Javascript
VUE脚手架具体使用方法
2019/05/20 Javascript
中高级前端必须了解的JS中的内存管理(推荐)
2019/07/04 Javascript
[19:15]DK战队纪录片
2014/09/02 DOTA
[02:22]《新闻直播间》2017年08月14日
2017/08/15 DOTA
[28:57]EG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/16 DOTA
详解Python中如何写控制台进度条的整理
2018/03/07 Python
pandas 对series和dataframe进行排序的实例
2018/06/09 Python
python匿名函数用法实例分析
2019/08/03 Python
Python实现图片添加文字
2019/11/26 Python
Django Haystack 全文检索与关键词高亮的实现
2020/02/17 Python
在服务器上安装python3.8.2环境的教程详解
2020/04/26 Python
如何在windows下安装Pycham2020软件(方法步骤详解)
2020/05/03 Python
python如何处理程序无法打开
2020/06/16 Python
解决Django响应JsonResponse返回json格式数据报错问题
2020/08/09 Python
HTML5添加鼠标悬浮音响效果不使用FLASH
2014/04/23 HTML / CSS
菲律宾领先的在线时尚商店:Zalora菲律宾
2018/02/08 全球购物
MyBag中文网:英国著名的时尚包袋电商零售网站
2020/07/31 全球购物
PHP中如何创建和修改数组
2012/05/02 面试题
会计实习生工作总结的自我评价
2013/10/07 职场文书
酒店销售经理岗位职责
2014/01/31 职场文书
护理专业毕业生自荐书
2014/05/24 职场文书
学校门卫岗位职责范本
2014/06/30 职场文书
春节超市活动方案
2014/08/14 职场文书
岳庙导游词
2015/02/04 职场文书
2015年社区科普工作总结
2015/05/13 职场文书