2012-06-29 46 views
1

我想知道什么是链接延迟最好的设计。请考虑下面的代码片段:等待链接推迟完成

组件X:

_functionRaisingEvent: function() 
{ 
    $.when(this.raiseEvent('myEvent', args)).done(function(args){ // Check for args.cancel }); 
}, 

_raiseEvent: function(event, args) 
{ 
    var def = new $.Deferred(); 

    // Call subscribers of myEvent in different components and pass them args 
    // Subscribers possibly make ajax calls 

    return def.promise(); 
}, 

认购Y:

_onMyEvent:function(args) 
{ 
    $.ajax(....).done(function(data){ if(data == 1) args.cancel = true;}); 
}, 

用户Z:

_onMyEvent:function(args) 
{ 
    document.getElementById('abx').display = 'block'; 
} 

_functionRaisingEvent调用_raiseEvent这触发了用户的回调。

我想实现的是,在_functionRaisingEvent中完成的回调只在所有订户完成后才执行。

我应该通过订户自己的延期为参数和使用管道?任何最佳实践或设计模式?

回答

0

的关键将改变这部分

_raiseEvent: function(event, args) { 
    var def = new $.Deferred(); 
    //Call subscribers... 
    return def.promise(); 
} 

...返回deferreds的集合,而不是一个,然后通过这些作为一个集合$.when。由于$.when不接受集合,并坚持要将对象作为单独的参数传递,所以常用的解决方法是通过由所有函数继承的apply()方法调用$.when

_raiseEvent: function(event, args) { 
    var def = new $.Deferred(); 
    //Call subscribers... - let's assume each returns an AJAX object 
    var result_subscr1 = call_subscriber_1(); 
    var result_subscr2 = call_subscriber_2(); 
    return [def.promise(), result_subscr1, result_subscr2]; 
} 

...然后改变当前的$.when()

$.when.apply(null, this.raiseEvent('myEvent', args)).done(... 

每推迟随后被传递给你的回调done(),在对象传递给$.when()订单的结果。