2013-03-28 64 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