我正在使用RequireJS / AMD分解我的JS应用程序。我的一个模块是一个“环境”模块,它只做一个请求(异步),然后存储返回的数据。此环境模块是我应用程序中几乎所有其他模块的依赖项。
我的问题是我需要立即获得此环境信息。有没有办法可以确保我的异步请求已经完成,并且在环境模块返回之前我的变量设置正确?
environment.js
define(["./opui"], function(opui){
var environment = {
jsonpath: null,
imgpath: null,
platform: null
};
//request environment data asynchronously
getEnvironment();
//callback that sets environment data
setEnvironment();
return environment;
})
答案 0 :(得分:1)
担心初始化顺序通常意味着设计存在缺陷;这正是RequireJS的用途。
在需要此environment
数据的每个模块中使用text plugin†:
define(['dep1', 'dep2', 'text!./environment'],
function (dep1, dep2, environmentJsonString) {
var environment = JSON.parse(environmentJsonString);
dep1.foo(environment.platform);
});
其中./environment
是将数据作为JSON返回的服务器端调用的URL,例如:
{ "jsonpath": "...",
"imgpath": "...",
"platform": "..." }
这使得在app启动期间检索数据成为依赖关系,因此RequireJS将负责等待对./environment
的异步AJAX调用返回。
请记住,所有模块都将共享相同的可变实例。另外,不要忘记在inlineText: false
的构建配置中设置r.js
,以避免在优化过程中内联该JSON字符串。
†有一个JSON插件可以处理text-> JSON解析,但由于某些原因它对我不起作用。