2013-06-17 12 views
8

基本的に、「サブ」モジュールはオブジェクトを作成し、そのオブジェクトは「メイン」モジュールであるユーティリティライブラリの一部でなければなりません。しかし、「サブ」オブジェクトは、「メイン」からユーティリティにを依存しますRequire.jsの循環依存を解決するには?

// Main module 
define(['sub'], function(sub) { 
    var utils = { 
     utilityMain: function() { 
      // ... 
     }; 
     // ... 
    }; 

    tools.subModule = sub; 

    return tools; 
}); 

// Sub module 
define(['main'], function(main) { 
    return new (function() { 

     // Singleton object using functions in main module 
     var somestuff = function() { 
      main.utilityMain(); 
      // etc 
     }; 
    })(); 
}); 

はどうやって地球全体を飲み込むだろうブラックホールを作成せずにrequire.jsでこれを達成することができますか?

ありがとうございました。

答えて

6

the docsで提案されているいくつかのことがあります。モジュールはrequire()メソッドを使用して定義された後

b(右文脈をするために使用されるように依存関係として必要と指定していることを確認し、後でaを取得することができます例えば

aを調べる:

// Sub module 
define(['require'], function(require) { 
    return new (function() { 

     // Singleton object using functions in main module 
     var somestuff = function() { 
      require('main').utilityMain(); 
      // etc 
     }; 
    })(); 
}); 

または

あなたの代わりに他のモジュール

などによる参照のためにすぐに利用可能であるモジュールに空のオブジェクトを作成するためにexportsを使用することができます。

// Main module 
define(['sub', 'exports'], function(sub, exports) { 
    exports.utilityMain: function() { 
     // ... 
    }; 

    exports.subModule = sub.sub; 
}); 
// Sub module 
define(['main', 'exports'], function(main, exports) { 
    exports.sub = new (function() { 

     // Singleton object using functions in main module 
     var somestuff = function() { 
      main.utilityMain(); 
      // etc 
     }; 
    })(); 
}); 

循環依存関係はまれであり、あなたがデザインを再考したいかもしれない兆候

+0

"デザインを再考する"、私は完全に同意しますが、それは現時点では少し緊密です。私はすでに調査し、あなたが提案しているものを見てきました...私は過去2日間、 'exports'オブジェクトの周りを頭で覆そうとしていました。ファクトリ関数が実行を再開すると 'export'が' define'/'require'に返されると思いましたか? 2番目の見方では、 'main'は' sub'が再開すると実行を再開するべきだと示唆しているようです。 – pilau

+0

あなたが本当にこれらのことがすべて起こる秩序を描くことができれば、本当に感謝します。私は、これが私の問題を解決するこの回避策を把握していないところだと思います。ありがとう! – pilau

+1

'exports'を使うと各モジュールが' undefined'の代わりに何らかのオブジェクトへの参照を持つことができます。どちらのモジュールの_functions_もすぐに使用することはできませんが、実行時に参照が正しく設定されることを確認できます。両方のモジュール定義が並行して実行されていると考えてください。彼らは両方とも、他のモジュールのどこを見るべきかを知っていますが、両方が完了するまで相互に作用することはありません。 – freejosh