2011-10-11 42 views
1
var o = new X(); 
o.setFooCallback1(function(result1){ 
}); 
o.setFooCallback2(function(result2){ 
}); 
o.foo("xxx"); 

,你可以看到,当我打电话o.foo(),这里有两种回调将有两个结果,result1result2,我想做的事被解雇在使用通result1result2我的构造函数来创建一个对象:如何获取两个异步函数的两个参数?

var y = new Y(result1, result2); 

但result1和result2进来不同的时间(异步),我该如何处理?
PS:类X是从别人的图书馆,我不能修改它的FPGA实现

回答

3

您需要实现所谓的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()) 

请注意,它只捕获第一个回调参数,但您可以轻松地将其扩展为任何您需要的。

0

呼叫来自相同的功能,这两个回调里面,但实际上只做任何事情,一旦他们都回来了,就像这样:

(function(){ 
    var y, r1, r2; 

    function runWhenBothReturn() { 
    if(r1 && r2) { //check both are set to a non-falsy value 
     y = new Y(r1, r2); 
    } 
    } 

    var o = new X(); 

    o.setFooCallback1(function(result1){ 
    r1 = result1; 
    runWhenBothReturn(); 
    }); 

    o.setFooCallback2(function(result2){ 
    r2 = result21; 
    runWhenBothReturn(); 
    }); 

    o.foo("xxx"); 

})(); 

注意到我添加了一个闭包,以便y,r1r2不会成为全局变量,但保持本地任务。

如果任r1r2可以计算结果为假值,然后确保更新if语句相应:)