2012-09-16 176 views
0

我有問題來處理異步調用。將異步調用轉換爲同步?

例如,我想用requirejs動態加載一些模塊。 目前我使用訂閱者 - 發佈者模式。不幸的是,這使得我的代碼 在某些情況下確實混亂...:

想象有正常工作的事件系統中的對象

var loader = { 
    load: function(modules) { 
     // do a async requirejs call 
     require(modules, function(){ 
      // map arguments to normal array 
      var modules = [].slice().call(arguments); 
      // fire loaded event, pass modules 
      this.trigger('loaded', modules); 
     }.bind(this)); 
    } 
}; 


var parent = { 
    // do some initialization work 
    initialize: function() { 
     // execute the second initialization when our modules have finished loading async 
     loader.on('loaded', this.secondInitialize, this); 
     // require the given modules in the array 
     loader.load(['one', 'two', 'three']); 
    }, 

    secondInitialize: function(modules) { 
     var three = new modules[2](); 
     // do something with the 'three' module 
    } 

}; 

正如你看到的,這是真的令人困惑。

是否有任何其他設計模式允許英俊處理異步呼叫?

+0

這是JavaScript中異步工作方式的一個不幸的副作用。沒有全面的解決方案。 – usr

+0

@usr可能不是一個全面的,但一個替代? – bodokaiser

回答

3

調查jQuery Deferred object。 (即使沒有JQ,大多數圖書館的JavaScript承諾的實現)

有了它,你可以做這樣的事情:

var loadingOne = getLibOne(); //returns a jquery deferred promise 
var loadingTwo = getLibTwo(); //returns another one 

var loadingAllLibraries = $.when(loadingOne, loadingTwo); 
loadingAllLibraries.done(function(lib1, lib2) { 
    //... stuff 
}); 

不完全是你的方案,但你的想法。編寫異步原子變得相對容易。

+1

@kyogron - 最好的辦法是檢查上面的鏈接,並開始玩它。這是可怕的看起來,但不是很複雜。更廣義的想法,你可以通過谷歌搜索「JavaScript承諾」 –

+0

聽起來不錯,將看看我可以如何在我的項目中實現這個最好:) – bodokaiser

+1

@kyogron - 順便說一句,一個類似的功能, jQuerys是回調http://api.jquery.com/jQuery.Callbacks/,它允許您快速創建發佈/訂閱隊列 –