23

新しい依存関係を計算し、それをフェッチして結果を返すモジュールを定義したいと思います。そのようです:

define(['defaults', 'get_config_name'], function(defaults, get_config_name) {
    var name = get_config_name();
    var config;
    require.synchronous([configs / '+name'], function(a) {
        config = defaults.extend(a);
    });
    return config;
});

これを行う方法、またはこの問題を攻撃するためのより良い方法はありますか?

4

2 に答える 2

19
  • 同期RequireJS呼び出し を使用しようとしても、モジュールがすでにロードされrequire('configs/'+get_config_name())ている場合にのみ同期的にロードされます。そうでない場合は、例外がスローされます。モジュール/JavaScriptファイルを同期的にロードすることは技術的に不可能です。UPD:可能ですが(Henriqueの回答を参照)、強くお勧めしません。ページ全体がフリーズする原因となるJavaScriptの実行をブロックします。したがって、RequireJSはそれをサポートしていません。

  • ユースケースから、同期RequireJSは必要ないようです。非同期で、結果を返す必要があります。 AMDパターンでは、依存関係を定義して非同期でロードできますが、モジュールのファクトリ関数は同期的に結果を返す必要があります。解決策は、ローダープラグインを使用することです(詳細はこちらこちら):

    // config_loader.js
    define(['defaults', 'get_config_name'], function(defaults, get_config_name) {
        return {
            load: function (resourceId, require, load) {
                var config_name = 'configs/' + get_config_name();
                require([config_name], function(config) {
                    load(defaults.extend(config));
                })
            }
        }
    });
    
    // application.js
    define(['config_loader!'], function(config) {
        // code using config
    });
    
  • get_config_name()単純なロジックが含まれていて、別のモジュールに依存しない場合は、フライパス構成オプションで計算するか、構成がコンテキストに依存する場合はマップ構成オプションを使用する方が適切です。

    function get_config_name() {
        // do something
    }
    require.config({
        paths: {
            'config': 'configs/' + get_config_name()
        }
    });
    require(['application', 'defaults', 'config'], function(application, defaults, config) {
        config = defaults.extend(config);
        application.start(config);
    });
    
于 2013-01-07T17:51:51.017 に答える
15

JavaScriptを同期的にロードすることは技術的に不可能ではありません。

function loadJS(file){  
   var js = $.ajax({ type: "GET", url: file, async: false }).responseText; //No need to append  
}

console.log('Test is loading...');
loadJS('test.js');
console.log('Test was loaded:', window.loadedModule); //loadedModule come from test.js
于 2015-01-18T14:42:55.770 に答える