Requirejs:在Module中等待require函数

时间:2013-10-09 08:13:29

标签: javascript requirejs

我有一个简单的翻译类(模块)来处理我的应用程序的本地化。在翻译类中,我正在使用require函数加载所需的语言模块。

define(['require', 'config', 'store'],
function(require, Config, Store) {
    // Using ECMAScript 5 strict mode during development. By default r.js will ignore that.
    'use strict';

    var translation = {
        locale: null,
        name: null,
        keys: null,
        timezones: null
    };

    var languageCode = Store.getInstance().get('LanguageCode') || Config.defaultLanguageCode;

    require(['translation/' + languageCode], function(trans) {
        translation = trans;
    });

    var get = function(key) {
        return (!!translation.keys && translation.keys[key]) ? translation.keys[key] : key;
    };

    var timezone = function(key) {
        return (translation.timezones[key]) ? translation.timezones[key] : key;
    };

    return {
        _: get,
        timezone: timezone,
        timezones: function() {
            return translation.timezones;
        }
    };
});

问题是return语句是在加载所需语言之前执行的。 我把translate类放在require shim中,然后在其他模块之前加载它,但是也没用。

1 个答案:

答案 0 :(得分:-1)

我在不使用承诺的情况下找到了解决您确切问题的方法。我使用函数WaitFor等待加载模块require()依赖项。

这就是我的App模块的样子:

define("App", ["Config"], function () {

    var queue = [];
    var fetchingId, cb;

    var App = {
        Dialog: null
    };

    require(["FloDialog"], function () {
        App.Dialog = new FloDialog();
    });

    return {
        WaitFor: function (id, callback) {
            if (!fetchingId) {
                fetchingId = id;
                cb = callback;
                require([id], function () {
                    cb(App);
                });
            } else {
                queue.push([id, callback]);
            }
        }
    };
});

注意底部的WaitFor功能。当我需要如下所示的模块App时,我使用WaitFor函数逐字地等待require()依赖项加载到模块中。当它准备就绪时,在我的情况下,我返回一个App变量,它现在包含App.Dialog var(并且加载了一个FloDialog类的实例)。

on some-page.html:

<script type="text/javascript">
  require(['App'], function (App) {

        App.WaitFor('FloDialog', function(App) {
            console.log(App.Dialog); // Yay! The instance is loaded and good to go!
        });

</script>