Require.js模块加载顺序

时间:2013-06-07 07:37:24

标签: javascript jquery requirejs

我有3个模块:模块A,模块B和模块C.

模块A在我的html页面中写入链接(链接来自ajax异步调用) 模块B也写了一些链接。 在我的模块C中,我想在模块A和B的链接上添加一个事件。

问题是模块加载顺序是随机的。 因此,当首先加载模块C时,没有链接,因为模块A和B还没有写入。

有没有办法在最后加载模块C?

感谢的

1 个答案:

答案 0 :(得分:2)

模块加载顺序 无关紧要。 E.g。

links1.js

define(function() {
    return { addLinks: function() { ... } };
})

links2.js

define(function() {
    return { addLinks: function() { ... } };
})

events.js

define(function() {
    return { addEvents: function() { ... } };
})

app.js

require(["links1", "links2", "events"], function(links1, links2, events) {
    links1.addLinks(...);
    links2.addLinks(...);
    events.addEvents(...);
});

换句话说,不要让你的模块在加载时执行某些操作,让它们返回当准备就绪时可以执行的方法。

上述模块可以按任何顺序加载......

  • links1,links2,events
  • links1,events,links2
  • links2,links1,events
  • links2,events,links1
  • events,links1,links2
  • events,links2,links1

并没关系。


编辑 - 如果links1使用XHR,则app需要在添加之前等待这些链接。

links1.js

define(function() {
    var promise = null;
    function loadLinks() {
        if (promise) {
            return promise;
        }
        return promise = $.ajax(...).then(function(data) {
            return convertDataToLinks(data);
        });
    }
    return {
        loadLinks: loadLinks,
        addLinks: function() { ... }
    };
})

app.js

require(["links1", "links2", "events"], function(links1, links2, events) {
    links1.loadLinks().then(function(links) {
        links1.addLinks(links);
        links2.addLinks(links);
        events.addEvents(...);
    });
});