Javascript引擎的长时间独占线程导致了纸箱的解决方案。
单线程的Javascript引擎的特点使大型循环处理通过长时间的专用线程,导致其他事件(如用户)不能及时响应,造成严重的卡顿甚至假死的现象。为了解决这些问题,一个可行的机制是将大周期分成几个小圆形的碎片,使Javascript引擎有时间段之间插入其他的事情,从而有效地提高性能的经验。ansync.js
复制代码代码如下所示:
Ansync(测度函数,segmentcount,workcallback,returncallback)
{
无功num_of_item_for_each_segment = segmentcount;
num_of_segment = math.ceil(VaR测度 / num_of_item_for_each_segment);
无功count_of_segment = 0;
VaR的定时器;
开始,结束;
this.process =功能(范围、超时)
{
如果(范围)!=未定义)
{
workcallback = workcallback.bind(范围);
returncallback = returncallback returncallback.bind(范围):定义;
}
如果(count_of_segment = num_of_segment)
{
ClearTimeout(定时器);
如果(returncallback!=未定义)
returncallback();
}
其他的
{
开始= count_of_segment * num_of_item_for_each_segment;
= Math.min(测度,((count_of_segment + 1)* num_of_item_for_each_segment);
如果(num_of_segment = = 1) / /不必创建计时器
{
workcallback(开始、结束);
count_of_segment = 1;
this.process();
}
其他的
{
定时器= setTimeout(功能ansynctimeout(){)
如果(workcallback(开始、结束)) / /完成的过程,如果函数返回true
{
count_of_segment = num_of_segment;
}
其他的
{
count_of_segment + +;
}
this.scope.process();
({ }。绑定范围:本}),超时= =定义的ansync.timeout:超时);
}
}
}
}
ansync.timeout = 5;
这个方法很简单,但非常实用,有一个小伙伴,对项目有同样的需求。