2010-07-05 148 views
1

我有簡單的JavaScript代碼使用Ajax API從服務器獲取XML。帶異步的jQuery Ajax調用返回null響應XML

function loadXML(path, node) { 
    var response_obj = ""; 
    /* Fire Ajax request and get the XML */ 
    var request_obj = ""; 
    $.ajax({ 
     async: true, 
     type: "GET", 
     url: path, 
     dataType: "xml", 
     success: function(XMLObj, status, resquestObj) { 
      response_obj = XMLObj; 
      request_obj = requestObj; 
     }, 
     error: function(){ 
      alert("Unable to fire AJAX request"); 
     } 
    }); 
    alert(response_obj); //<-- This is NULL if async=true 
    /* More logic to follow which will use response_obj (XML) 
     and render it in the 'node' argument passed. */ 
} 

其中,所述路徑對應於有效 XML(使用W3C validator測試)和節點指向的HTML頁面,其中響應具有一個DIV元件被解析和所附。

我需要的是,Ajax調用應該返回我將解析並呈現的responseXML對象。爲此,我將響應XML分配給本地變量(本地函數的作用域),然後使用它(目前我只是將它發送給alert)。現在

,問題是,當我使用該功能async設置爲false,該alert調用成功返回[object XMLDocument]。但只要我將async更改爲true,nullalert打印。

我的理解是,當async:true,最後alert甚至在Ajax調用返回XML之前被調用。同樣,當async:false,這是一個序列化的調用,並且當控制到達最後的alert調用時,XML已經到達。

我應該怎麼做,這樣:

  1. 我作爲局部變量返回由阿賈克斯 調用,這樣 我可以使用它們的響應對象(和 請求對象)。據我所知, 回調函數,如果傳遞給 success,將有三個 參數 - 但是,我不知道如何 從該調用返回回 功能到我loadXML功能。
  2. 我不必將Ajax調用轉換爲同步,因爲這只是我正在觸發的函數之一 - 還有許多其他的Ajax調用也會被髮出。
  3. 我是否正確假設async:false已在此函數中序列化,而async:true不是?

回答

1

是的,你提到的有關async:true是正確的。所以很自然,alert()會失敗,如果異步是真實的,如果異步是假的,它會工作。

您應該將alert()置於成功回調中。

或者你也可以使一個功能說ajaxSuccess,並稱它成功Callback()。 把alert()放在那個ajaxSuccess函數中。

+0

感謝您的回覆。實際上,哪個函數獲得XML,還需要HTML'節點' - 所以,我的問題是我該怎麼做,以便回調也有節點。 (如果在問題文本中沒有暗示,我很抱歉)。無論如何,爲了確認我的理解。 – Shrey 2010-07-05 15:34:33