2014-12-19 51 views
0

我正在加載2個XML文檔,它們都成功運行函數,但第2個XML文檔的函數依賴於第1個完成。ajax加載2個XML文檔,按順序排列,無異步:false

如果我有異步:真:

1 XML

function XmlDataTypes() { 

    var result = null; 
    var scriptUrl = "http://domain.com/xml/test.XmlDataTypes?AccountId=" + AccountId; 
    $.ajax(
    { 
     url: scriptUrl, 
     type: 'get', 
     dataType: 'xml', 
     async: true, 
     success: function (data) { 

     //create array to be used in second XML 
     for (var i = 0; i < xmlRows.length; i++) { 

         var dataType = xmlRows[i]; 

         var dataTypeId = nodeValue(dataType.getElementsByTagName("DataTypeId")[0]); 
         var dataTypeName = nodeValue(dataType.getElementsByTagName("DataTypeName")[0]); 

         dataTypeArray.push({ dataTypeId: dataTypeId, dataTypeName: dataTypeName, position: i, markerArray: [] }); 

        } 



     }, 
     error: function onXmlError() { 
      alert("An Error has occurred."); 
     } 

    }); 

    return result; 

} 

第二屆XML

function XmlAmenityData() { 

    var result = null; 
    var scriptUrl = "http://domain.com/xml/test.XmlAmenityData?AccountId=" + AccountId; 
    $.ajax(
    { 
     url: scriptUrl, 
     type: 'get', 
     dataType: 'xml', 
     async: true, 
     success: function (data) { 

     //store this info in markerArray in dataTypeArray 

     }, 
     error: function onXmlError() { 
      alert("An Error has occurred."); 
     } 

    }); 

    return result; 

} 

XML數據可以按隨機順序加載,以便爲函數如果第一個文件沒有完成,第二個文件將會出錯。

如果我設置:

async: false 

它工作正常,但我得到一個警告:

Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. 

有沒有辦法解決,而無需使用:

async: false 

回答

4

由於第二xml依賴於1st,你可以定義一個成功的回調。 此外,由於ajax是異步的,所以在調用回調時必須分配結果。你可以在你的函數中定義一個變量(在這種情況下是一個數組),並把數據放在那裏。

var result = []; 
function XmlDataTypes(url, accountId, callback) { 
    var scriptUrl = url + accountId; 
    $.ajax({ 
     url: scriptUrl, 
     type: 'get', 
     dataType: 'xml', 
     async: true, 
     success: function (data) { 
      // do something 
      result.push(data); 
      if(typeof callback == 'function') { 
       callback(); 
      } 
     }, 
     error: function onXmlError() { 
      alert("An Error has occurred."); 
     } 
    }); 
} 

function doSomething() { 
    // Do something to store this info in markerArray in dataTypeArray 
    // XmlAmenityData is in results var. 
} 

而且你可以使用它像這樣

var _callback = XmlDataTypes("http://domain.com/xml/test.XmlAmenityData?AccountId=", "1234", doSomething); 
XmlDataTypes("http://domain.com/xml/test.XmlDataTypes?AccountId=", "1234", _callback); 

編輯:根據給定的場景更新腳本。

+0

謝謝,試圖實現這一點。但是第二個XML文檔沒有加載,我已經更新了我的代碼以顯示它之前的情況。 – JBoom 2014-12-19 14:30:37

+0

不要忘記添加網址作爲參數了。 – MamaWalter 2014-12-19 16:26:23

+1

感謝@MamaWalter,包括它。 – John 2014-12-22 08:27:57

0

你可以嘗試返回$就當成了承諾:

function XmlDataTypes() { 

// note domain.com was changes to example.com - this should be changed back 

var scriptUrl = "http://example.com/xml/test.XmlDataTypes?AccountId=" + AccountId; 
return $.ajax(
{ 
    url: scriptUrl, 
    type: 'get', 
    dataType: 'xml', 
    async: true, 
    success: function (data) { 

    //create array to be used in second XML 
    for (var i = 0; i < xmlRows.length; i++) { 

        var dataType = xmlRows[i]; 

        var dataTypeId = nodeValue(dataType.getElementsByTagName("DataTypeId")[0]); 
        var dataTypeName = nodeValue(dataType.getElementsByTagName("DataTypeName")[0]); 

        dataTypeArray.push({ dataTypeId: dataTypeId, dataTypeName: dataTypeName, position: i, markerArray: [] }); 

       } 
    }, 
    error: function onXmlError() { 
     alert("An Error has occurred."); 
    } 

});  

} 

然後按順序美其名曰:

XmlDataTypes.done(XmlAmenityData); 

下面是一些更多的文檔: http://www.htmlgoodies.com/beyond/javascript/making-promises-with-jquery-deferred.html