Если вы знаете, что функции на самом деле первоклассные объекты в Javascript, вы можете придумать довольно элегантное решение .
Без любых дополнительных объектов или глобальных переменных .
function callback1() {
callback1.done = true;
commonCallback();
}
function callback2() {
callback2.done = true;
commonCallback();
}
function commonCallback() {
if (callback1.done && callback2.done) {
// do stuff, since you know both calls have come back.
}
}
Почему это так элегантно? Поскольку вы инкапсулировали данные , ваша область действия свободна от бесполезных переменных, а код более читабелен , чем когда-либо. Насколько круто это? :)
UPDATE
А если вам нужно более общее решение, попробуйте следующее:
function callback() {
callback.number -= 1;
if (callback.number === 0) {
// do stuff since all calls finished
callback.last();
}
}
callback.newQueue = function(num, last) {
callback.number = num;
callback.last = last;
}
// EXAMPLE USAGE
// our last function to be invoked
function afterEverythingDone(){ alert("done"); }
// create a new callback queue
callback.newQueue(3, afterEverythingDone);
// as time passes you call the callback
// function after every request
callback();
callback();
callback();
// after all call is finished
// afterEverythingDone() executes
Снова удивительно:)