3

一部の環境で条件付きで2番目のモジュールを必要とするAMDモジュールがあると仮定します。

define(["require"]、function(require){
  var myObj = {
    foo:console.error.bind(console)
  };
  if(browserEnv)
    require(["./ conditional-polyfill"]、function(polyfill){
      myObj.foo = console.log.bind(console、polyfill);
    });
  myObjを返します。//条件付きrequireが満たされる前に戻ります
});

問題は、条件付き要求が完了した後、define()呼び出しを遅らせてreturn / callbackを返すにはどうすればよいですか?

つまり、以下のコードは失敗します:

require(["module-from-above"]、function(logger){
  logger.foo( "こんにちは!"); //console.errorが呼び出されます
});

この問題の解決策についての私の考え:

  • インライン./polyfillにすると、すべてが機能します。ただし、これは問題を回避するだけであり、すべての場合に機能するとは限りません。理由でモジュール化してほしい。
  • 後で実行される代わりに、 Deferredオブジェクトを返すことができます。これはうまくいくでしょうが、いつも電話をかけるのは本当に醜いです。myObj./conditional-polyfillloggerDeferred.then(function(logger){ ... });
  • このモジュール用のAMDローダープラグインを作成できます。そして、すべての準備ができたらすぐにコールバックを呼び出します。繰り返しますが、これは機能しますが、独自のローダープラグインは私のビルドツールでは機能しません。

私が考えることができるすべての解決策は、優れたコードよりもハックです。しかし、私の問題はそれほど大げさではないと思います。それで、これをどのように処理するのですか?

4

2 に答える 2

3

「ファクトリ関数」の外側に条件をプッシュします (AMD コミュニティで一般的に require および define のコールバック関数を参照するために使用される名前)

;(function() {

function factory(require, polyfill){
  var myObj = { 
    foo: console.error.bind(console) 
  }
  if(polyfill){
    myObj.foo = console.log.bind(console, polyfill)
  }
  return myObj
}

var need = ['require']

if(browserEnv){
  need.push("./conditional-polyfill")
}

define(need, factory)

})();
于 2013-01-15T19:33:23.540 に答える
0

あなたが言うように、私はDeferredを使います。

遅延パターンは、複雑な非同期操作を一貫した方法で結び付けることができるため、この種の問題に対する理想的なソリューションです。

コードが少し大きくなりますが、ローダーやビルド ツールを変更するのに比べれば簡単な解決策です。

于 2013-01-15T15:46:51.993 に答える