2012-06-29 74 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()訂單的結果。