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 相关文章推荐
JavaScript中关于indexOf的使用方法与问题小结
Aug 05 Javascript
functional继承模式 摘自javascript:the good parts
Jun 20 Javascript
javascript操作excel生成报表全攻略
May 04 Javascript
使用Sticker.js实现贴纸效果
Jan 28 Javascript
JQuery实现鼠标滚轮滑动到页面节点
Jul 28 Javascript
基于jQuery滑动杆实现购买日期选择效果
Sep 15 Javascript
jQuery改变form表单的action,并进行提交的实现代码
May 25 Javascript
全面解析JavaScript中apply和call以及bind(推荐)
Jun 15 Javascript
ES6入门教程之Class和Module详解
May 17 Javascript
JS实现移动端触屏拖拽功能
Jul 31 Javascript
js实现京东秒杀倒计时功能
Jan 21 Javascript
koa2服务端使用jwt进行鉴权及路由权限分发的流程分析
Jul 22 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
Terran剧情介绍
2020/03/14 星际争霸
根据ip调用新浪api获取城市名并转成拼音
2014/03/07 PHP
Yii学习总结之数据访问对象 (DAO)
2015/02/22 PHP
PHP code 验证码生成类定义和简单使用示例
2020/05/27 PHP
jquery之Document元素选择器篇
2008/08/14 Javascript
学习面向对象之面向对象的术语
2010/11/30 Javascript
主页面中的两个iframe实现鼠标拖动改变其大小
2013/04/16 Javascript
js 单击式的下拉菜单效果实例
2013/08/13 Javascript
js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
2015/11/18 Javascript
javascript先序遍历DOM树的方法
2016/02/27 Javascript
node.js 中国天气预报 简单实现
2016/06/06 Javascript
jquery实现数字输入框
2017/02/22 Javascript
详谈angularjs中路由页面强制更新的问题
2017/04/24 Javascript
node.js+jQuery实现用户登录注册AJAX交互
2017/04/28 jQuery
gulp解决跨域的配置文件问题
2017/06/08 Javascript
JavaScript 中的 this 简单规则
2017/09/19 Javascript
小程序数据通信方法大全(推荐)
2019/04/15 Javascript
vue 组件内获取actions的response方式
2019/11/08 Javascript
基于vue-cli3创建libs库的实现方法
2019/12/04 Javascript
Vue开发环境跨域访问问题
2020/01/22 Javascript
解决vue2中使用elementUi打包报错的问题
2020/09/22 Javascript
Python中装饰器学习总结
2018/02/10 Python
Python二进制文件读取并转换为浮点数详解
2019/06/25 Python
django一对多模型以及如何在前端实现详解
2019/07/24 Python
Django搭建项目实战与避坑细节详解
2020/12/06 Python
Lookfantastic日本官网:英国知名护肤、化妆品和头发护理购物网站
2018/04/21 全球购物
软件部经理岗位职责范本
2014/02/25 职场文书
婚庆司仪主持词
2014/03/15 职场文书
乡镇网格化管理实施方案
2014/03/23 职场文书
幼师求职自荐信
2014/05/31 职场文书
单位消防安全责任书
2014/07/23 职场文书
要账委托书范本
2014/09/15 职场文书
搞笑的爱情检讨书
2014/10/01 职场文书
个人合作协议范本
2015/08/06 职场文书
Jackson 反序列化时实现大小写不敏感设置
2021/06/29 Java/Android
python使用BeautifulSoup 解析HTML
2022/04/24 Python