2

我有一个简单的翻译类(模块)来处理我的应用程序的本地化。在翻译类中,我正在使用 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 语句是在所需语言加载之前执行的。我将翻译类放在 require shim 中以在其他模块之前加载它,但这也不起作用。

4

1 回答 1

-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 变量(并且加载了 FloDialog 类的一个实例)。

在 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>
于 2017-11-15T13:36:42.433 回答