2013-08-31 58 views
1

我使用AJAX请求从数据库中获取数值。 AJAX函数位于另一个函数内,该函数应返回AJAX请求的值。但是,因为AJAX请求的返回值是xmlhttp.onreadystatechange函数内的局部变量,所以它不会更改return_count函数的“更高级别”temp_return。我不能让“lower”函数返回值并将其赋值给一个变量,因为它已经定义为xmlhttp.onreadystatechange ...我怎样才能改变这个,使得return_count函数将返回正确的值而不是42(预定义的出于测试目的)?从AJAX函数内部修改外部变量?

function return_count(ajax_userid,ajax_date,ajax_KT,ajax_KS) 
{ 
    var temp_return = 42; 
    xmlhttp.onreadystatechange = 
    function() 
    { 
     if(xmlhttp.readyState == 4 && xmlhttp.status == 200) 
     { 
      temp_return = xmlhttp.responseText; 
     } 
    } 
    xmlhttp.open("GET", "count.php?userid="+ajax_userid+"&date="+ajax_date+"&KT="+ajax_KT+"&KS="+ajax_KS, true); 
    xmlhttp.send(); 
    return temp_return; 
} 
+0

做出ajax请求[同步](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Synchronous_and_Asynchronous_Requests),如果你不想阻塞页面,你需要调用函数而不是返回。 –

+0

* AJAX中的* A *表示**异步**,您不能从ajax调用返回变量,您需要通过回调函数(通常作为ajax的参数传递)来使用它“major”函数),它将只有一个参数(返回的数据,在本例中为'xmlhttp.responseText'),并且将使用该参数进行调用。 –

+0

可能重复[如何从AJAX调用返回响应?](http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call) – adeneo

回答

1

你可以做到这一点的2种方式...

让你AJAX(RECOMENDED)回调

创建异步回调继续你的流量; d

function return_count(ajax_userid,ajax_date,ajax_KT,ajax_KS, callback) 
{ 
    var otherCallback; 
    var temp_return = 42; 
    xmlhttp.onreadystatechange = 
    function() 
    { 
     if(xmlhttp.readyState == 4 && xmlhttp.status == 200) 
     { 
      temp_return = xmlhttp.responseText; 
      if(typeof callback === "function") callback(temp_return); 
      if(typeof otherCallback === "function") otherCallback(temp_return); 
     } 
    } 
    xmlhttp.open("GET", "count.php?userid="+ajax_userid+"&date="+ajax_date+"&KT="+ajax_KT+"&KS="+ajax_KS, true); 
    xmlhttp.send(); 

    return { done: function (callback2){ 
      otherCallback = callback2; 

    } }; 
} 

你可以像下面这样使用...

参数回调

return_count(userid, date, KT, KS, function (count) { 

    alert("returned " + count); 

});

或管回调

return_count(userid, date, KT, KS) 
    .done(function (count) { 

     alert("returned " + count); 

    }); 

作出同步AJAX

加入 “假” 来标志异步...

function return_count(ajax_userid,ajax_date,ajax_KT,ajax_KS) 
{ 
    var temp_return = 42; 
    xmlhttp.onreadystatechange = 
    function() 
    { 
     if(xmlhttp.readyState == 4 && xmlhttp.status == 200) 
     { 
      temp_return = xmlhttp.responseText; 
     } 
    } 
    xmlhttp.open("GET", "count.php?userid="+ajax_userid+"&date="+ajax_date+"&KT="+ajax_KT+"&KS="+ajax_KS, false); 
    xmlhttp.send(); 
    return temp_return; 
} 

但这种方法锁定您的UI是对UX不好。