2013-04-29 34 views
0

我以最虚拟的方式获取全局变量的数据。目前:如何从ajax加载全局变量获取promisses

var tranlationJson = 
    $.ajax({ 
    type: "GET", 
    url: "translation.xml", 
    contentType: "text/xml", 
    dataType: "xml", 
    success: function (dataSource) {    
     tranlationJson=ToJasonParser(dataSource); 
    } 
    }); 

而且我想修改它以使用promisses。问题是,下面的代码是使用第三方js文件,所以我的代码是这样

<script 
<script 

var tranlationJson = $.ajax({ ... 

<script 111 
<script 222 

和脚本111和222含有将使用translationJson在它的自定义libraties。那么如何确保在加载脚本之前翻译Json会被填充?

+0

我完全不理解第二部分......。 – Shikiryu 2013-04-29 14:52:30

+0

正如您现在所做的那样,您无法确保变量已设置。为了实现你想要的,你必须在AJAX请求的成功回调中构建后面的脚本标签。 – 2013-04-29 15:07:50

回答

0

存在全局变量,您可以通过任何脚本访问该变量:window。而不是你的var translationJson = $.ajax({...,你可以做window.translationJson = $.ajax({...。但有两件重要的事情在这里:

首先是你不知道会先发生什么:ajax请求完成或你的一些脚本已经要求你的变量。解决方案是绑定所有取决于您的变量脚本运行到$.ajax({ success:回调。就像这样:

$.ajax({ 
     type: "GET", 
     url: "translation.xml", 
     contentType: "text/xml", 
     dataType: "xml", 
     success: function (dataSource) {    
      tranlationJson=ToJasonParser(dataSource); 
      someScriptRun(); /* here you run some depending on your variable script */ 
     } 
    }); 

另一种方法是在所有相关的脚本这样来检查变量:

var periodicalAttemptToRunScriptDependant = setInterval(function(){ 
    if('object' == typeof window.translationJson){ 
    someScriptRun(); /* here you run some depending on your variable script */ 
    clearInterval(periodicalAttemptToRunScriptDependant); 
    } 
}, 1000); 

二:在您的示例的变量的任何请求都将导致Ajax请求,因为它是实际上不是变量,而是函数。尝试将您的代码更改为:

var tranlationJson; 
$.ajax({ 
    type: "GET", 
    url: "translation.xml", 
    contentType: "text/xml", 
    dataType: "xml", 
    success: function (dataSource) {    
     tranlationJson = ToJasonParser(dataSource); 
    } 
}); 
+0

这是好的方法来使用: 成功:function(dataSource){ tranlationJson = ToJasonParser(dataSource); $ .getScript(“test.js”); } 并加载2-3个脚本? – 2013-04-30 08:01:15

+0

如果您只在ajax调用完成后才开始下载脚本 - 与几乎同时下载所有脚本相比,它会花费更多的时间,但会按照我的建议定义一系列运行。因此,getScript将工作,但更长一点。 – zeliboba 2013-04-30 08:06:54