Я себе сделал банальную очередь. Но это в клиенском жс. Мне нужно было сделать несоколько аяксовых запросов, а затем когда все закончится выполнить один результирующий (или не один) в итоге вышла такая хрень:
var queryQueue = {
counter: 0,
finishEvents: [],
push: function()
{
queryQueue.counter ++;
},
pop: function()
{
queryQueue.counter --;
if( queryQueue.counter === 0 )
{
queryQueue.fireFinish();
}
},
addFinishEvent: function( func )
{
queryQueue.finishEvents.push( func );
if( queryQueue.counter === 0 )
{
queryQueue.fireFinish();
}
},
fireFinish: function()
{
var func = null;
while( func = queryQueue.finishEvents.pop() )
{
func();
}
}
}
В итоге когда делаем что-то, выполняем quertQueue.push() когда действие закончилось queryQueue.pop()
после всех пушей добавляем обработчики, которые выполнятся по окончанию всех запросов (или сразу если очередь пуста).
Вариант с флагами сразу отмел, так как при изменении количества задач придется менять количество флагов.