使用async的jQuery Ajax调用返回null responseXML
我有简单的JavaScript代码,它使用Ajax API从服务器获取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(使用W3Cvalidation器测试),并且节点指向HTML页面上的DIV元素,其中必须解析和附加响应。
我需要的是Ajax调用应该返回我将解析和呈现的responseXML
对象。 为此,我将响应XML分配给本地变量(本函数的本地范围),然后使用它(目前我只是将其发送到警报)。
现在,问题是当我使用async
设置为false
此函数时, alert
调用成功返回[object XMLDocument]
。 但是一旦我将async
更改为true
,就会通过alert
打印null
。
我的理解是,当async:true
,即使在Ajax调用返回XML之前,也会调用最后一个alert
。 类似地,当async:false
,这是一个序列化调用,当控制到达最后一个alert
调用时,XML已经到达。
我应该怎么做:
- 我有响应对象(和请求对象)由局部变量中的Ajax调用返回,以便我可以使用它们。 我知道回调函数,如果传递给
success
,将有三个参数 – 但是,我不知道如何从该回调函数返回到我的loadXML
函数。 - 我没有必要将Ajax调用转换为同步,因为这只是我正在触发的函数之一 – 还有许多其他Ajax调用也要发布。
- 我是否正确地假设
async:false
在此函数中被序列化而async:true
不是?
是的,您提到的有关async:true
是正确的。 因此,如果async为true,则alert()
自然会失败,如果async为false,它将会起作用。
您应该将alert()
放入成功回调中。
或者你也可以创建一个函数说ajaxSuccess
并成功调用它Callback()
。 将alert()
放在ajaxSuccess
函数中。