配置RequireJS模块仅在初始化时返回

时间:2012-06-14 12:38:27

标签: javascript jquery-plugins requirejs

我正在使用RequireJS来构建我当前的JS项目,并且我有一些库/ jQuery插件需要在可以使用之前进行初始化。初始化是异步的,返回时将调用回调。因此,下面的代码引入了竞争条件(依赖性加载已初始化?):

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();
    }
);

有没有人知道我怎么能要求依赖'wait'(也就是同步),直到库也被初始化了?

1 个答案:

答案 0 :(得分: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关闭很棒,但是当你刚刚掌握它们时,两者都会有点混乱。