2010-08-06 92 views
1

好吧,我已经到处寻找这个。我正在删除一些变量声明,因为我可以确保我的XMLHttpRequest正在工作。Ajax只返回readyState == 4值

function submit_edit_form() 
{ 
    // id and title are already declared 
    var x = ajax_edit_form_save(id, 'title', title); 
    alert(x); 
} 
function ajax_edit_form_save(id, property, new_value) 
{ 

    if (window.XMLHttpRequest) 
    { 
     xmlhttp = new XMLHttpRequest(); 
    } 
    else 
    { 
     // screw IE5 & IE6 
     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xmlhttp.onreadystatechange = function() 
    { 
     if (xmlhttp.readyState == 4 && xmlhttp.responseText != '') 
     {  
      return xmlhttp.responseText; 
     } 
    } 

    // myURL is already defined. I'm not troubleshooting this part, I know it's working 
    xmlhttp.open("GET", myURL, true); 
    xmlhttp.send(); 
} 

所以,当我打电话submit_edit_form(),它调用ajax_edit_form_save(),我得到 '未定义' 警报。我知道问题是,ajax_edit_form_save()在readyState 1上返回undefined。我抓住我的头,因为我只有在readyState == 4时返回。4.我怎样才能阻止返回值,以便x得到实际responseText的?

回答

3

即使在ajax调用完成之前,您的函数正在返回,因为它是异步的。你的“onreadystatechange”中的return语句将不会产生任何效果,因为该值返回给方法“onreadystatechange”的调用方,该方法是XMLHttpRequest对象而不是代码。

你应该通过一个回调函数来你ajax_edit_form_save被称为当readyState为4

请看下图:

function ajax_edit_form_save(id, property, new_value, funCallback) // ==> callback function 
{ 

    if (window.XMLHttpRequest) 
    { 
     xmlhttp = new XMLHttpRequest(); 
    } 
    else 
    { 
     // screw IE5 & IE6 
     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xmlhttp.onreadystatechange = function() 
    { 
     if (xmlhttp.readyState == 4 && xmlhttp.responseText != '') 
     {  
      callback(xmlhttp.responseText); // =============> callback function called 
     } 
    } 

    // myURL is already defined. I'm not troubleshooting this part, I know it's working 
    xmlhttp.open("GET", myURL, true); 
    xmlhttp.send(); 
} 

回调函数可以是:

function handleReponse(resp) { 
    // do something with resp 
} 

ajax_edit_form_save("myID", "myProperty", "new value", handleResponse); 
+0

哥们我觉得我爱你。我完全没有想到这一点。我要检查一下,我会给你支票。 – 2010-08-06 05:51:47

+0

好的,我完全可以接受并使用它。谢谢! – 2010-08-06 05:59:33

+0

@Adam Tootle欢迎您! – naikus 2010-08-06 06:18:41

0

哪儿了你从哪个文件中得到(x)?我想,你忘了提及URL值。

+1

这不是问题。我知道请求正常工作。我只需要处理返回值。 – 2010-08-06 06:00:42