2014-02-26 257 views
0

我有我认为一个全局变量的问题。观看这个:AJAX全局变量? (Javascript)

function more_elems() { 
var ret = []; 

var xmlhttp = new XMLHttpRequest(); 
xmlhttp.onreadystatechange=function() 
    { 

if (xmlhttp.readyState==4 && xmlhttp.status==200) 
{ 
var JSONObject = JSON.parse(xmlhttp.responseText); 
for (i=0;i<5;i++){ 
    ret[i] = 
    { 
    id: JSONObject[i].id, 
    nombre: JSONObject[i].nombre, 
    mensaje: JSONObject[i].mensaje, 
    ult_m: JSONObject[i].ultima_modificacion 
    }; 

} 
alert(ret); 
} 
    } 
xmlhttp.open("GET","somewesite.com",true); 
xmlhttp.send(); 
return ret; 

所以即时尝试返回ret数组,但它返回undefined。但是,如果我在xmlhttp.onreadystatechange = function()中做了一个警报,它确实显示了带有json对象的数组。我不确定问题是什么= /。

在此先感谢。

+1

你需要了解的回调是什么... http://stackoverflow.com/questions/9596276/how-to-explain-callbacks-in-plain-english-how-他们是不同的从调用o – rafaelcastrocouto

+0

即使你的变量范围很难是正确的,请看看[this](http://stackoverflow.com/q/500431/2752041)。它可以帮助你理解更好的变量范围和全局变量。 ;) – mathielo

回答

0

Ajax是异步的。因此ret array将不会被设置,当您在xmlhttp.send().

后立即调用ret array设置的值有任何mehtod和传递值。泰类似下面,

xmlhttp.onreadystatechange=function() 
    { 

     if (xmlhttp.readyState==4 && xmlhttp.status==200) 
     { 
      var JSONObject = JSON.parse(xmlhttp.responseText); 
      for (i=0;i<5;i++){ 
      ret[i] ={ 
       id: JSONObject[i].id, 
       nombre: JSONObject[i].nombre, 
       mensaje: JSONObject[i].mensaje, 
       ult_m: JSONObject[i].ultima_modificacion 
      }; 

     } 
     onAjaxSuccess(ret); 
     } 
    } 

function onAjaxSuccess(arr){ 
    alert(arr); 
} 
+0

是的,这工作!谢谢。但是,如果我尝试返回主函数 - >函数more_elems(),会怎么样呢?因为这就是我试图达到的目标。在该函数上返回ret数组。 –

+0

希望它有帮助。你不能这样做,因为我说Ajax是异步的,当你在函数结尾返回时,'ret array'不会被设置为值。希望它有帮助。不要介意将它标记为正确的答案;) –

+0

对..好吧,我必须弄清楚如何做到这一点。谢谢,并会做:) –