您需要實現所謂的semaphore pattern
這裏是一個手-on實現:
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())
請注意,它只捕獲第一個回調參數,但您可以輕鬆地將其擴展爲任何您需要的。