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高级学习笔记整理
Aug 14 Javascript
通过下拉框的值来确定输入框是否可以为空的代码
Oct 18 Javascript
jQuery对html元素取值与赋值的方法
Nov 20 Javascript
Jquery解析json字符串及json数组的方法
May 29 Javascript
JavaScript常用基础知识强化学习
Dec 09 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【一】
May 10 Javascript
js学习笔记之事件处理模型
Oct 31 Javascript
详解jQuery选择器
Dec 21 Javascript
jQuery实现加入收藏夹功能(主流浏览器兼职)
Dec 24 Javascript
详解vue组件基础
May 04 Javascript
javacript replace 正则取字符串中的值并替换【推荐】
Sep 13 Javascript
layui问题之渲染数据表格时,仅出现10条数据的解决方法
Sep 12 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 上传文件的方法(类)
2009/07/30 PHP
php使用filter过滤器验证邮箱 ipv6地址 url验证
2013/12/25 PHP
浅析application/x-www-form-urlencoded和multipart/form-data的区别
2014/06/22 PHP
推荐一款MAC OS X 下php集成开发环境mamp
2014/11/08 PHP
php删除指定目录的方法
2015/04/03 PHP
老生常谈PHP数组函数array_merge(必看篇)
2017/05/25 PHP
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
2008/08/14 Javascript
JavaScript之appendChild、insertBefore和insertAfter使用说明
2010/12/30 Javascript
js字符编码函数区别分析
2011/12/28 Javascript
解析JavaScript中的标签语句
2013/06/19 Javascript
JS 在指定数组中随机取出N个不重复的数据
2014/06/10 Javascript
JavaScript获取指定元素位置的方法
2015/04/08 Javascript
简介JavaScript中search()方法的使用
2015/06/06 Javascript
JS实现的Select三级下拉菜单代码
2015/08/20 Javascript
轻松学习jQuery插件EasyUI EasyUI创建菜单与按钮
2015/11/30 Javascript
vue项目总结之文件夹结构配置详解
2017/12/13 Javascript
vue-router项目实战总结篇
2018/02/11 Javascript
基于nodejs的雪碧图制作工具的示例代码
2018/11/05 NodeJs
Vue和React组件之间的传值方式详解
2019/01/31 Javascript
详解element-ui中表单验证的三种方式
2019/09/18 Javascript
Python中使用支持向量机SVM实践
2017/12/27 Python
Python实现App自动签到领取积分功能
2018/09/29 Python
Python面向对象程序设计之继承、多态原理与用法详解
2020/03/23 Python
python实现感知机模型的示例
2020/09/30 Python
分享一个python的aes加密代码
2020/12/22 Python
Python爬虫制作翻译程序的示例代码
2021/02/22 Python
mui几种页面跳转方式对比总结概括
2017/08/18 HTML / CSS
Looking4Parking美国:全球排名第一的机场停车比较品牌
2019/08/26 全球购物
Python文件操作的面试题
2013/06/22 面试题
七年级数学教学反思
2014/01/22 职场文书
宣传工作经验材料
2014/06/02 职场文书
2014年最新党员对照检查材料汇总
2014/09/15 职场文书
学校政风行风评议心得体会
2014/10/21 职场文书
2016年学校爱国卫生月活动总结
2016/04/06 职场文书
2019年圣诞节祝福语集锦
2019/12/25 职场文书
springboot+rabbitmq实现智能家居实例详解
2022/07/23 Java/Android