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将url中的参数加密解密代码
Nov 17 Javascript
在ASP.NET MVC项目中使用RequireJS库的用法示例
Feb 15 Javascript
利用D3.js实现最简单的柱状图示例代码
Dec 09 Javascript
jQuery实现ajax无刷新分页页码控件
Feb 28 Javascript
Webpack中css-loader和less-loader的使用教程
Apr 27 Javascript
Node.js 回调函数实例详解
Jul 06 Javascript
JS库之Three.js 简易入门教程(详解之一)
Sep 13 Javascript
AngularJS使用ng-repeat遍历二维数组元素的方法详解
Nov 11 Javascript
详解AngularJS 过滤器的使用
Jun 02 Javascript
Vue中消息横向滚动时setInterval清不掉的问题及解决方法
Aug 23 Javascript
js使用文档就绪函数动态改变页面内容示例【innerHTML、innerText】
Nov 07 Javascript
vue 监听窗口变化对页面部分元素重新渲染操作
Jul 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
dedecms模版制作使用方法
2007/04/03 PHP
php设计模式之单例模式使用示例
2014/01/20 PHP
jQuery Mobile + PHP实现文件上传
2014/12/12 PHP
Yii实现文章列表置顶功能示例
2016/10/18 PHP
ThinkPHP5.0 图片上传生成缩略图实例代码说明
2018/06/20 PHP
JavaScript事件处理器中的event参数使用介绍
2013/05/24 Javascript
jQuery使用getJSON方法获取json数据完整示例
2016/09/13 Javascript
JS动态计算移动端rem的解决方案
2016/10/14 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
2016/11/25 Javascript
vue增删改查的简单操作
2017/07/15 Javascript
nodejs操作mongodb的填删改查模块的制作及引入实例
2018/01/02 NodeJs
分析javascript原型及原型链
2018/03/18 Javascript
AngularJS自定义过滤器用法经典实例总结
2018/05/17 Javascript
浅谈微信小程序flex布局基础
2018/09/10 Javascript
单页面vue引入百度统计的使用方法示例详解
2018/10/13 Javascript
layui输入框中只允许输入整数的实现方法
2019/09/18 Javascript
JS控制GIF图片的停止与显示
2019/10/24 Javascript
vue下的@change事件的实现
2019/10/25 Javascript
使用Promise封装小程序wx.request的实现方法
2019/11/13 Javascript
Vue-resource安装过程及使用方法解析
2020/07/21 Javascript
Python警察与小偷的实现之一客户端与服务端通信实例
2014/10/09 Python
Pycharm学习教程(4) Python解释器的相关配置
2017/05/03 Python
python读写LMDB文件的方法
2018/07/02 Python
浅谈python编译pyc工程--导包问题解决
2019/03/20 Python
使用python-opencv读取视频,计算视频总帧数及FPS的实现
2019/12/10 Python
nginx搭建基于python的web环境的实现步骤
2020/01/03 Python
wxPython修改文本框颜色过程解析
2020/02/14 Python
商场消防管理制度
2014/01/12 职场文书
个性与发展自我评价
2014/02/11 职场文书
初中班主任评语
2014/04/24 职场文书
反邪教宣传工作方案
2014/05/07 职场文书
幼儿园大班开学寄语
2014/08/02 职场文书
小区的门卫岗位职责
2014/10/01 职场文书
2014年大学班级工作总结
2014/11/14 职场文书
2016年“六一儿童节”校园广播稿
2015/12/17 职场文书
mysql优化
2021/04/06 MySQL