2010-07-05 94 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