Javascript Requirejs:在模块内等待require函数
我有一个简单的翻译类(模块),用于处理我的应用程序的本地化。在translate类中,我使用require函数加载所需的语言模块Javascript Requirejs:在模块内等待require函数,javascript,requirejs,Javascript,Requirejs,我有一个简单的翻译类(模块),用于处理我的应用程序的本地化。在translate类中,我使用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';
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中,以便在其他模块之前加载它,但这也不起作用 我找到了一个解决你确切问题的方法,而不用承诺。我使用函数
WaitFor
等待模块require()
依赖项加载
这就是我的应用程序模块的外观:
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
函数。当我需要如下所示的模块应用程序时,我使用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>
需要(['App'],函数(App){
App.WaitFor('FloDialog',函数(App){
console.log(App.Dialog);//耶!实例已加载,可以运行了!
});
我在不使用承诺的情况下找到了您的确切问题的解决方案。我使用函数WaitFor
等待模块require()
依赖项加载
这就是我的应用程序模块的外观:
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
函数。当我需要如下所示的模块应用程序时,我使用WaitFor
函数直接等待require()
依赖项加载到模块中。在我的例子中,当它准备好时,我返回一个现在包含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>
需要(['App'],函数(App){
App.WaitFor('FloDialog',函数(App){
console.log(App.Dialog);//耶!实例已加载,可以运行了!
});
你应该检查它会让你的生活更轻松谢谢你。我会检查它。你应该检查它会让你的生活更轻松谢谢你。我会检查它。