JavaScript エンジンのシングルスレッドの性質により、大規模なループのトラバーサルを処理するときにスレッドが長時間独占され、その結果、他のイベント (ユーザー操作など) にタイムリーに応答できなくなります。ひどい場合には、凍死や仮死状態に陥ることもあります。上記の問題を解決するための実現可能なメカニズムは、大きなループをいくつかの小さなループ セグメントに分割し、それらをスライスで実行することです。これにより、JavaScript エンジンは各セグメント間に他のものを挿入して実行できるようになり、それによって効果的にパフォーマンスを向上させることができます。パフォーマンス経験
Ansync.js
function Ansync (totalCount、segmentCount、workCallback、returnCallback)
{
var num_of_item_for_each_segment = セグメント数;
var num_of_segment = Math.ceil(totalCount / num_of_item_for_each_segment);
var count_of_segment = 0;
var タイマー;
var 開始、終了;
this.process = function(スコープ, タイムアウト)
{
if (スコープ != 未定義)
{
workCallback = workCallback.bind(scope);
returnCallback = returnCallback ? returnCallback.bind(スコープ) : 未定義;
}
if (セグメント数 == セグメント数)
{
clearTimeout(タイマー);
if (returnCallback != 未定義)
returnCallback();
}
それ以外
{
start = セグメント数 * 各セグメントの項目数;
end = Math.min(totalCount, (セグメント数 1) * 各セグメントの項目数);
if (num_of_segment == 1)//タイマーを作成する必要はありません
{
workCallback(start, end);
セグメント数 = 1;
this.process();
}
それ以外
{
timer = setTimeout(function ansyncTimeout(){
if (workCallback(start, end)) //関数がtrueを返したら処理を終了
{
セグメント数 = セグメント数;
}
それ以外
{
セグメント数 ;
}
this.scope.process();
}.bind({scope: this}),timeout == 未定義 ? Ansync.TimeOut : タイムアウト);
}
}
}
}
Ansync.TimeOut = 5;
方法は完全ですが、同じ目的の要件がある小さな協力者です。参考下吧