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 相关文章推荐
jQuery的一些注意
Dec 06 Javascript
插件:检测javascript的内存泄漏
Mar 04 Javascript
js 显示base64编码的二进制流网页图片
Apr 04 Javascript
jQuery点击改变class并toggle及toggleClass()方法定义用法
Dec 11 Javascript
js实现C#的StringBuilder效果完整实例
Dec 22 Javascript
JavaScript-html标题滚动效果的简单实现
Sep 08 Javascript
jQuery焦点图左右转换效果
Dec 12 Javascript
JS实现鼠标移上去显示图片或微信二维码
Dec 14 Javascript
Vue2.0利用 v-model 实现组件props双向绑定的优美解决方案
Mar 13 Javascript
浅谈Koa服务限流方法实践
Oct 23 Javascript
JavaScript箭头函数中的this详解
Jun 19 Javascript
JavaScript选择器函数querySelector和querySelectorAll
Nov 27 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/07/02 PHP
PHP和Mysqlweb应用开发核心技术-第1部分 Php基础-2 php语言介绍
2011/07/03 PHP
值得分享的php+ajax实时聊天室
2016/07/20 PHP
Yii框架批量插入数据扩展类的简单实现方法
2017/05/23 PHP
TP5.0框架实现无限极回复功能的方法分析
2019/05/04 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
2020/04/04 PHP
Javascript Cookie读写删除操作的函数
2010/03/02 Javascript
js固定DIV高度,超出部分自动添加滚动条的简单方法
2013/07/10 Javascript
nodejs中实现路由功能
2014/12/29 NodeJs
高效利用Angular中内置服务$http、$location等
2016/03/22 Javascript
关于 jQuery Easyui异步加载tree的问题解析
2016/12/06 Javascript
javascript中的try catch异常捕获机制用法分析
2016/12/14 Javascript
原生JavaScript实现AJAX、JSONP
2017/02/07 Javascript
vue.js之vue-cli脚手架的搭建详解
2017/05/05 Javascript
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
微信小程序下拉框功能的实例代码
2018/11/06 Javascript
vue组件数据传递、父子组件数据获取,slot,router路由功能示例
2019/03/19 Javascript
koa+jwt实现token验证与刷新功能
2019/05/30 Javascript
解决Vue项目中tff报错的问题
2020/10/21 Javascript
[00:35]DOTA2上海特级锦标赛 MVP.Phx战队宣传片
2016/03/04 DOTA
Python中的tuple元组详细介绍
2015/02/02 Python
python3解析库pyquery的深入讲解
2018/06/26 Python
解决python super()调用多重继承函数的问题
2019/06/26 Python
html5的自定义data-*属性与jquery的data()方法的使用
2014/07/02 HTML / CSS
印尼最大的婴儿用品购物网站:Orami
2017/09/28 全球购物
Doyoueven官网:澳大利亚健身服饰和配饰品牌
2019/03/24 全球购物
零件设计自荐信范文
2013/11/27 职场文书
工厂保洁员岗位职责
2013/12/04 职场文书
社区居务公开实施方案
2014/03/27 职场文书
党员示范岗材料
2014/12/19 职场文书
预备党员个人总结
2015/02/14 职场文书
2015年人民调解工作总结
2015/05/18 职场文书
2016年党员创先争优公开承诺书
2016/03/25 职场文书
导游词之珠海轮廓
2019/10/25 职场文书
vue实现在data里引入相对路径
2022/06/05 Vue.js
利用Apache Common将java对象池化的问题
2022/06/16 Servers