RequireJS加载.js,但内联代码仍然是异步的吗?

时间:2013-11-08 18:29:04

标签: asynchronous requirejs

从我看到的使用调试器,调用:

require(["menu/main-menu"], function(util) {

是否会加载main-menu.js文件,但是在执行所需的.js文件中的全局代码之前调用该函数?这是对的吗?

如果是这样,在调用函数之前执行所有代码的最佳方法是什么?

我想解决的问题是我希望mani-menu.js中的代码都在模块中。但是我无法调用该模块中的任何方法,直到执行了创建模块的全局代码。

我可以在那里调用一个全局方法,然后创建所有内容,但是每个.js文件中都需要一个全局的init()方法(每个方法都有一个唯一的名称)。

处理这一切的最佳方法是什么?

更新:这里有一个更基本的问题(也许)。在编写javascript(我使用Sencha Ext JS& TypeScript)时,我需要创建我的对象。因此,当我创建说出我的主菜单时,我想在main-menu.js文件中调用一个方法来获取我创建的Ext JS派生菜单对象。

我认为main-menu.js中的所有代码都应该在命名空间中,包括我调用以获取菜单对象的方法。那是对的吗?另外,设置大多数Ext JS代码的方式是你有几个Ext.define()调用以及其他变量实例化,然后是接受所有这些的函数,构建完整的菜单并返回它。但是在我调用之前,这需要在main-menu.js中执行所有代码。

我接近这个吗?我迄今为止的经验是Java& C#和我可能试图将该模型错误地放到javascript上。

1 个答案:

答案 0 :(得分:1)

我们假设menu/main-menu.js包含这个:

define(function () {
    // Module factory function
    return [... whatever you want to expose...];
});

您的应用程序执行此操作:

require(["menu/main-menu"], function (util) {
    // Require callback.
});

会发生什么:

  1. require来电加载menu/main-menu.js

  2. 执行define中的menu/main-menu.js

  3. 执行模块工厂功能(传递给define的功能)。

  4. 执行require回调时,符号util设置为 menu/main-menu.js中的工厂功能返回了什么。

  5. 至于模拟命名空间,有多种方法可以实现。对于 例如,你可以这样做:

    define(function () {
        return {
            foo: function () {},
            bar: function () {},
            [...]
        };
    });
    

    这会导出一个包含两个函数的对象。然后你可以使用它 像这样:

    require(["menu/main-menu"], function (util) {
        util.foo();
        util.bar();
    });
    

    RequireJS还支持CommonJS风格的定义模块:

    define(function (require, exports, module) {
        exports.foo = function () {};
        exports.bar = function () {};
        [...]
    });
    

    这在功能上等同于我定义模块的第一种方式 之前:你得到了相同的两个函数,你可以在同一个函数中使用它们 正如我上面所示的那样。

    不幸的是,我不能专门谈论Ext JS,因为我没有 用它。