我是使用AJAX编码的新手,不明白为什么下面使用回调的异步函数不能正常工作。变量PC是全局变量,用于测试时设置为PC = 666。应为PC分配从XML文件读取的值1。我使用的代码如下所示。
function makePlaceRequest(XMLaddress, callback) {
httpRequest = new XMLHttpRequest();
// alert('Starting XML read');
if (!httpRequest) {
alert('Warning :( Cannot create an XMLHTTP instance');
return false;
}
// httpRequest.onreadystatechange = getPlace;
// State changes
httpRequest.onreadystatechange = function() {
try {
if (httpRequest.readyState === XMLHttpRequest.DONE) {
if (httpRequest.status === 200) {
var xmldoc = httpRequest.responseXML;
var root_node = xmldoc.getElementsByTagName('placecode').item(0);
PC = root_node.firstChild.data;
// callback();
}
else {
alert('There was a problem with the request.');
}
}
}
catch( e ) {
alert('Caught Exception: ' + e.description);
}
}
httpRequest.open('GET', XMLaddress);
// httpRequest.open('GET', '/xml/Places.xml');
httpRequest.send();
callback();
}
makePlaceRequest('/xml/Places.xml', function() {
alert(PC);
alert('Completed XML read');
alert(PC);
});
我按如下方式调用该函数:makePlaceRequest('/xml/Places.xml');
第一个( PC )警报显示666,即,在成功读取XML文件之前调用回调,并且第二个PC警报显示正确的值,即,我假定后者的发生是由于info消息引入的延迟(完成的XML读取)。我不明白为什么在处理完成之前调用回调函数。
发布于 2019-10-20 02:25:24
对httpRequest.send()的调用是异步的,因此不会等待AJAX调用完成。因此,在AJAX调用收到响应并处理该响应之前,很可能会调用callback()。
当接收到响应时,程序流将被中断以运行onreadystatechange处理程序。当onreadystatechange处理程序完成运行时,中断的程序流继续运行。
onreadystatechange处理程序中注释掉的callback()将确保仅在接收和处理响应后才调用callback()。
https://stackoverflow.com/questions/58466424
复制相似问题