带异步的jQuery Ajax调用返回null响应XML
问题描述:
我有简单的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
,null
由alert
打印。
我的理解是,当async:true
,最后alert
甚至在Ajax调用返回XML之前被调用。同样,当async:false
,这是一个序列化的调用,并且当控制到达最后的alert
调用时,XML已经到达。
我应该怎么做,这样:
- 我作为局部变量返回由阿贾克斯 调用,这样 我可以使用它们的响应对象(和 请求对象)。据我所知, 回调函数,如果传递给
success
,将有三个 参数 - 但是,我不知道如何 从该调用返回回 功能到我loadXML
功能。 - 我不必将Ajax调用转换为同步,因为这只是我正在触发的函数之一 - 还有许多其他的Ajax调用也会被发出。
- 我是否正确假设
async:false
已在此函数中序列化,而async:true
不是?
答
是的,你提到的有关async:true
是正确的。所以很自然,alert()
会失败,如果异步是真实的,如果异步是假的,它会工作。
您应该将alert()
置于成功回调中。
或者你也可以使一个功能说ajaxSuccess
,并称它成功Callback()
。 把alert()
放在那个ajaxSuccess
函数中。
感谢您的回复。实际上,哪个函数获得XML,还需要HTML'节点' - 所以,我的问题是我该怎么做,以便回调也有节点。 (如果在问题文本中没有暗示,我很抱歉)。无论如何,为了确认我的理解。 – Shrey 2010-07-05 15:34:33