在这段代码中这个方法返回undefined despites alert语句打印一个值?
function getNearestPoint(idd)
{
var xmlhttp;
var result;
if(window.XMLHttpRequest)
xmlhttp=new XMLHttpRequest();
else
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
result= xmlhttp.responseText;
alert(result);
}
}
xmlhttp.open("GET","ajax_get_nearest_location.php?id="+idd +"&radius=1",true);
xmlhttp.send();
return result;
}
答案 0 :(得分:2)
结果未在此时定义,只有在回调执行后才会定义。执行顺序:
getNearestPoint
开始getNearestPoint
返回undefiend
xmlhttp.onreadystatechange
如果你需要OUTSIDE的结果,你应该使用回调:
getNearestPoint(idd, cb){
...
xmlhttp.onreadystatechange = function(){
...
cb(result);
}
}
并且您的调用代码更改为:
var result = getNearestPoint(id);
为:
getNearestPoint(id, function(result){
// do something with result;
});
答案 1 :(得分:0)
这是因为Ajax的异步性(“异步JavaScript和XML”):当您的代码命中return result
时,请求仍将继续运行。尚未调用readystatechange回调,并且result
变量尚未设置。
处理此问题的常用方法是更改脚本的体系结构:直接在result
回调中根据onreadystatechange
执行您需要执行的操作。 (或者,当然,传递带有所需操作的回调函数并在处理程序中执行它。)
答案 2 :(得分:0)
result
设置语句在异步Ajax函数因为您的第二个if
语句(设置result
值)未被命中。为什么不?因为您发送Ajax请求的那一刻,您将返回仍未定义的result
值。 Ajax调用稍后将执行匿名函数并设置很久以前返回的result
变量。