2013-03-28 62 views
2

因此,這裏是我的代碼流:requireJS 2.1.5依賴無序嵌套需要

main.js --> jquerymobile --> router --> extra --> lib1 --> lib2 

在extra.js,後負荷高達LIB2,設置我的模塊

//extra.js 
require(['lib1'], function() { 
     $("#body").append('<p>got lib1</p>'); 
     require(['lib2'], 
      $("#body").append('<p>got lib2</p>'); 
      window.stuff = true; 
      $("#body").append('<p>set my module</ 
     }); 

}); 

在我router.js,我用我的模塊加載後佔用額外的:

//router.js 
require(['../extra'], function() { 
     $("#body").append('<p>using my module</p>'); 
     console.log(window.stuff); 
    }); 

我期待我的模塊來建立它在路由器使用前.js文件。然而,這是命令我得到:

set my router 
using my module 
got lib1 
got lib2 
set my module 

當然,我得到了一個未定義當我嘗試使用我的模塊(window.stuff)。

這裏是這個錯誤演示:https://dl.dropbox.com/u/19311981/demo.zip

你們能幫助我找出我做錯了什麼在我指定的依賴?

回答

3

當額外的回報是使用define syntax並且預先聲明它們爲依賴時,您可以確保lib1和lib2被加載的唯一方法。以後再做與其他任何異步調用類似。你不知道什麼時候會回來。

//extra.js 
define(['lib1', 'lib2'], function(lib1, lib2) { 
    $("#body").append('<p>got lib1</p>'); 
    $("#body").append('<p>got lib2</p>'); 
    window.stuff = true; 
    $("#body").append('<p>set my module</ 
    return something; 
}); 

您可能還想重新考慮使用全局window.something變量作爲模塊中的通信方法。相反,讓模塊返回一些可以使用的對象:

//router.js 
require(['../extra'], function(extra) { 
    $("#body").append('<p>using my module</p>'); 
    console.log(extra); 
}); 
+0

謝謝你的回答。但是在'extra.js'中使用嵌套require的原因是爲了保證'lib1.js'在'lib2.js'之前加載。把它們放在需要數組的定義中會加載它們,但我認爲它不會指定哪一個應該首先加載。 – bizi 2013-03-28 16:53:41

+0

如果lib2需要lib1,那麼它應該這樣定義,類似於我上面用extra.js提出的 – explunit 2013-03-28 17:01:11

+0

非常感謝。 'lib1'和'lib2'不是我的代碼,它們被下載。所以,起初我想讓他們保持聯繫。 (如果有人維護我的代碼,他可能會在下載新版本時覆蓋定義模式)。但似乎使用'define'語法是唯一的方法來管理這個。我現在有正確的順序。再次感謝您提出的答案。我現在將它標記爲正確的答案。 – bizi 2013-03-28 18:06:21