我有一个简单的翻译类(模块)来处理我的应用程序的本地化。在翻译类中,我正在使用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中,然后在其他模块之前加载它,但是也没用。
答案 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>