我在同一条船上。我有点喜欢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)的简单别名,它更有效率。” –