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 相关文章推荐
JS获取键盘上任意按键的值(实例代码)
Nov 12 Javascript
又一款js时钟!transform实现时钟效果
Aug 15 Javascript
图文详解Javascript中的上下文和作用域
Feb 15 Javascript
微信小程序实战之自定义toast(6)
Apr 18 Javascript
Vue项目中最新用到的一些实用小技巧
Nov 06 Javascript
手动下载Chrome并解决puppeteer无法使用问题
Nov 12 Javascript
react-router4按需加载(踩坑填坑)
Jan 06 Javascript
Vue表单之v-model绑定下拉列表功能
May 14 Javascript
新手快速入门微信小程序组件库 iView Weapp
Jun 24 Javascript
layuiAdmin循环遍历展示商品图片列表的方法
Sep 16 Javascript
vue+elementUI中表格高亮或字体颜色改变操作
Nov 02 Javascript
node使用async_hooks模块进行请求追踪
Jan 28 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
php中变量及部分适用方法
2008/03/27 PHP
php下连接mssql2005的代码
2011/01/17 PHP
PHP无限分类(树形类)
2013/09/28 PHP
php与flash as3 socket通信传送文件实现代码
2014/08/16 PHP
Laravel中的chunk组块结果集处理与注意问题
2018/08/15 PHP
javascript 贪吃蛇实现代码
2008/11/22 Javascript
jQeury淡入淡出需要注意的问题
2010/09/08 Javascript
js对数字的格式化使用说明
2011/01/12 Javascript
js与jquery中获取当前鼠标的x、y坐标位置的代码
2011/05/23 Javascript
js arguments对象应用介绍
2012/11/28 Javascript
jQuery实现可收缩展开的级联菜单实例代码
2013/11/27 Javascript
JavaSacript中charCodeAt()方法的使用详解
2015/06/05 Javascript
jstree的简单实例
2016/12/01 Javascript
微信公众号开发 实现点击返回按钮就返回到聊天界面
2016/12/15 Javascript
js实现定时进度条完成后切换图片
2017/01/04 Javascript
原生js实现放大镜
2017/02/20 Javascript
React中使用collections时key的重要性详解
2017/08/07 Javascript
JS实现的简单拖拽购物车功能示例【附源码下载】
2018/01/03 Javascript
详解vue中组件参数
2018/07/09 Javascript
nodejs微信开发之自动回复的实现
2019/03/17 NodeJs
vue 解决异步数据更新问题
2019/10/29 Javascript
用Python操作字符串之rindex()方法的使用
2015/05/19 Python
Python使用min、max函数查找二维数据矩阵中最小、最大值的方法
2018/05/15 Python
IntelliJ IDEA安装运行python插件方法
2018/12/10 Python
python处理excel绘制雷达图
2019/10/18 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
2020/06/30 Python
Python csv文件记录流程代码解析
2020/07/16 Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
2020/11/28 Python
canvas三角函数模拟水波效果的示例代码
2018/07/03 HTML / CSS
英国珠宝钟表和家居礼品精品店:David Shuttle
2018/02/24 全球购物
巴西美妆购物网站:Kutiz Beauté
2019/03/13 全球购物
士力架广告词
2014/03/20 职场文书
护理专业求职信
2014/06/15 职场文书
让人瞬间清醒的句子,句句经典,字字如金
2019/07/08 职场文书
利用Python判断整数是否是回文数的3种方法总结
2021/07/07 Python
Java移除无效括号的方法实现
2021/08/07 Java/Android