2014-01-24 186 views
3

即時通訊使用requirejs加載一個Web應用程序的幾個模塊即時通訊的建設,但我很難理解的東西。我有我的主要模塊需要它依賴,但其他定義的模塊都在某種程度上相互引用。所以可以說'project/func'模塊可以在'project/save'模塊中調用一個保存函數。現在我的大部分代碼都導致了未定義的錯誤。RequireJS模塊相互引用

從網上閱讀也許我打了一些被稱爲循環參考?我不太確定。我想我需要知道我做錯了什麼,我該怎麼做。我試圖在下面的例子中用主模塊在其中一個模塊中調用bootstrap方法,但該模塊在某個時候調用另一個模塊。這只是一個小例子。真正的應用程序有很多更多的模塊,並且如果有意義的話,它們都需要在其他每個模塊中運行函數。

//main require 
require(['jquery', 'jqueryui', 'project/save', 'project/funcs', 'project/spec'], function($, ui, proSave, proFunc, proSpec){ 
    proFunc.bootstrap();  
}); 

//project/save 
define(function(){ 
    var save = function(){ 
     //do some save stuff here 
    } 
    return { 
     save: save 
    } 
}); 

//project/funcs 
define(['project/save'], function(proSave){ 
    var funcs = { 
     bootstrap: function(){ 
      //do some stuff 
      funcs.func1(); 
     }, 
     func1: function(){ 
     //do some stuff and save 
     proSave.save(); 
    } 
    } 
    return { 
     funcs: funcs 
    } 
}); 
+0

你能指出你在問題中顯示的代碼中的圓形?因爲現在我沒有看到它。 – Louis

+0

也許更好更簡單的解釋是我有一個功能A和B的模塊和另一個功能C的模塊。功能A調用功能C,但C然後需要調用功能B.您的答案下面幫助,我會嘗試看看我在哪裏得到 – azzy81

回答

5

RequireJS對循環依賴documentation說明如何處理它們:

如果你定義一個循環依賴(一個需要B和B需要一個),那麼在這種情況下,當B的模塊功能被調用,它會得到一個未定義的值。 b的取後面的模塊已經通過使用要求()方法來定義之後(一定要指定要求的依賴關係,正確的上下文中被用來查找一):

//Inside b.js: 
    define(["require", "a"], 
    function(require, a) { 
     //"a" in this case will be null if a also asked for b, 
     //a circular dependency. 
     return function(title) { 
      return require("a").doSomething(); 
     } 
    } 
); 

所以,你必須編寫代碼以便能夠處理循環依賴中的模塊定義最初未定義的事實。你如何完成這些細節取決於你的應用程序的特定結構。

智慧的這些話,從RequireJS文件,是非常值得關注:

循環的依賴關係是罕見的,通常,你可能要重新考慮設計一個標誌。

[着重加入。]很多時候,如果模塊A依賴於B和B取決於A,有從A或B將被提取的功能的子集和移動到模塊C,這將允許一個取決於C而不是B,B取決於C而不是A,並打破循環依賴。爲了每個使用這些代碼的人,這是最好的選擇。然後,在極少數情況下,圓形不能被刪除,我上面引用的文檔告訴你如何處理它。

+0

謝謝! OP可能沒有接受這個答案,但它確實幫了我。 :-)我剛接觸requirejs/amdjs,不知道如何引用另一個模塊。然後我找到了你的答案,並意識到它與AngularJS的繼承方式非常相似。 –