我在同一條船上。我有點喜歡Node的異步函數,所以我寫了這個async 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),並將某些代碼「燒」一段時間,而不是設置迭代次數。
感謝您的澄清,謝謝! – TERMtm
雖然快速問題:廣泛使用setTimeout,安全還是昂貴? – TERMtm
如果你正在使用超時時間爲'0'的'setTimeout',你應該改用[process.nextTick'](http://nodejs.org/docs/latest/api/process.html#process_process_nexttick_callback)。 「在事件循環的下一個循環中調用此回調函數,這不是setTimeout(fn,0)的簡單別名,它更有效率。」 –