私は同じ船に乗っています。私はNodeの非同期関数が好きだったので、この非同期ForおよびForEach関数を作成しました。「setTimeout(Func、0);」を使用します 騙す。
ライブラリは次のとおりです。
var WilkesAsyncBurn = function()
{
var Now = function() {return (new Date());};
var CreateFutureDate = function(milliseconds)
{
var t = Now();
t.setTime(t.getTime() + milliseconds);
return t;
};
var For = function(start, end, eachCallback, finalCallback, msBurnTime)
{
var i = start;
var Each = function()
{
if(i==-1) {return;} //always does one last each with nothing to do
setTimeout(Each,0);
var burnTimeout = CreateFutureDate(msBurnTime);
while(Now() < burnTimeout)
{
if(i>=end) {i=-1; finalCallback(); return;}
eachCallback(i);
i++;
}
};
Each();
};
var ForEach = function(array, eachCallback, finalCallback, msBurnTime)
{
var i = 0;
var len = array.length;
var Each = function()
{
if(i==-1) {return;}
setTimeout(Each,0);
var burnTimeout = CreateFutureDate(msBurnTime);
while(Now() < burnTimeout)
{
if(i>=len) {i=-1; finalCallback(array); return;}
eachCallback(i, array[i]);
i++;
}
};
Each();
};
var pub = {};
pub.For = For; //eachCallback(index); finalCallback();
pub.ForEach = ForEach; //eachCallback(index,value); finalCallback(array);
WilkesAsyncBurn = pub;
};
使用例:
WilkesAsyncBurn(); // Init the library
console.log("start");
var FuncEach = function(index)
{
if(index%10000==0)
{
console.log("index=" + index);
}
};
var FuncFinal = function()
{
console.log("done");
};
WilkesAsyncBurn.For(0,2000000,FuncEach,FuncFinal,50);
印刷:インデックス=10000インデックス=20000インデックス=30000など「完了」
興味があればさらに調査する:
setTimeoutとsetIntervalの最小オーバーヘッド時間は約2〜10ミリ秒であるため、数千または数百万のタイマーの起動が理由もなく遅くなります。したがって、基本的に、ブラウザをロックせずに数千以上のループを実行する必要がある場合は、スレッド(gasp)のようになり、一定の反復回数ではなく、一定の時間コードを「書き込む」必要があります。