3

現在の JS プロジェクトを構築するために RequireJS を使用しています。使用する前に初期化する必要があるライブラリ/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();
    }
);

ライブラリも初期化されるまで、依存関係の要求を「待機」させる方法を知っている人はいますか (同期的に行うこともできます)。

4

1 に答える 1

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クロージャは素晴らしいですが、それらのコツをつかんでいるときは、どちらも少し混乱する可能性があります。

于 2012-06-14T16:22:01.433 に答える