2012-06-14 36 views
3

我正在使用RequireJS來構建我當前的JS項目,並且我有一些庫/ jQuery插件需要在可以使用之前進行初始化。初始化是異步的,返回時會調用回調。因此下面的代碼引入了競爭條件(是依賴加載初始化):配置RequireJS模塊僅在初始化時返回

dep_that_needs_to_be_initialized_before_it_can_be_used.js:

define(
    ['raw_library_source'], 
    function(){ 
     // this init call is async and will invoke the callback when done 
     // $ is global 
     $.plugin.init({ 
      //config 
     },callback); 
    } 
); 

app.js:

define(
    ['dep_that_needs_to_be_initialized_before_it_can_be_used'], 
    function(){ 
     // the following line may fail in case the dependcy is not yet initialzed 
     $.plugin.doSomething(); 
    } 
); 

有誰知道我可以使依賴的'等待'的要求(也叫做同步),直到它也被初始化?

回答

2

我通常這樣做的方式是從插件包裝模塊返回包裝函數,然後用回調調用返回的包裝函數。再加上模塊閉包中的一個標誌,以表明插件是否已經初始化,我認爲你有一個解決方案。

例子:

//pluginWrapper.js 
define(
    ['jquery', 'plugins/jquery.plugin'], 
    function($) { 
    var isInitialized = false; 
    return function (callback) { 
     if (isInitialized) { 
     callback(); 
     } else { 
     $.plugin.init({}, function() { 
      isInitialized = true; 
      callback(); 
     }); 
     } 
    }; 
    } 
); 

然後,在你想用你的插件中的任何模塊,您可以:

define(['jquery', 'pluginWrapper'], 
    function($, pluginWrapper) { 
    pluginWrapper(function() { 
     // use the plugin here. it will be initialized. 
    } 
    } 
); 

AMD模塊和JavaScript閉包是偉大的,但兩者可以是有點混亂,當你只是得到他們的縈繞。

+0

感謝您的回答,有趣的做法,我會一起去吧! – thomaux