2013-02-07 45 views
1

我正在使用RequireJS/AMD来分解我的JS应用程序。我的模块之一是一个“环境”模块,除了发出请求(异步)并且然后存储返回的数据外,其他都不做任何事情。这个环境模块是我应用程序中几乎所有其他模块的依赖项。RequireJS/AMD和全局可用值

我的问题是我需要立即提供此环境信息。有没有一种方法可以确保我的异步请求已完成,并且我的变量在环境模块返回前正确设置?

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; 

}) 

回答

1

不必担心初始化命令往往意味着设计是有缺陷的;这正是RequireJS的用武之地。

使用每个模块中的text plugin†需要这个environment数据:

define(['dep1', 'dep2', 'text!./environment'], 
    function (dep1, dep2, environmentJsonString) { 
    var environment = JSON.parse(environmentJsonString); 
    dep1.foo(environment.platform); 
}); 

哪里./environment是服务器端调用返回的数据作为JSON的网址,如:

{ "jsonpath": "...", 
    "imgpath": "...", 
    "platform": "..." } 

这使得在应用程序启动期间检索数据依赖项,因此RequireJS将负责等待异步AJAX调用返回./environment

请记住,所有模块将共享相同的可变实例。此外,不要忘记在r.js的构建配置中设置inlineText: false,以避免在优化过程中内联JSON字符串。

有一个JSON插件可以处理文本 - > JSON解析,但由于某种原因,它不适用于我。