对于嵌套的require,requireJS 2.1.5依赖项无序

时间:2013-03-28 01:34:25

标签: dependencies requirejs

所以这是我的代码流程:

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 );
    });

我希望在router.js中使用之前设置我的模块。但是,这是我得到的顺序:

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

当我尝试使用我的模块(window.stuff)时,我当然得到了未定义。

以下是此错误的演示:https://dl.dropbox.com/u/19311981/demo.zip

你能帮助我弄清楚在指定依赖关系时我做错了什么吗?

1 个答案:

答案 0 :(得分:3)

唯一可以确保在额外返回时加载lib1和lib2的方法是使用define syntax并将它们预先声明为依赖项。稍后再做它类似于任何其他异步调用。你不知道什么时候会回来。

//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 );
});