2013-04-29 33 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