Вам необходимо реализовать так называемый шаблон семафора
Вот практическая реализация:
var o = new X()
, n = 0
, result1, result2
function checkResults(){
if (--n > 0) return;
var y = new Y(result1, result2)
}
o.setFooCallback1(function(res){
result1 = res
checkResults()
})
o.setFooCallback2(function(res){
result2 = res
checkResults()
})
Или объектно-ориентированный подход:
function Semaphore(callback){
this.callback = callback
this.count = 0
this.args = []
}
Semaphore.prototype.check = function(){
if (--this.count <= 0)
this.callback.apply(null, this.args)
}
Semaphore.prototype.queue = function(){
var self = this
self.count++
return function(res){
self.args.push(res)
self.check()
}
}
var fooResults = new Semaphore(function(res1, res2){
var y = new Y(res1, res2)
})
o.setFooCallback1(fooResults.queue())
o.setFooCallback2(fooResults.queue())
Обратите внимание, что он захватывает только первые аргументы обратного вызова, но вы можете легко расширить его на все, что вам нужно.