Ajax只返回readyState == 4的值

时间:2010-08-06 05:38:57

标签: javascript ajax xmlhttprequest

好的,我到处寻找这个。我正在删除一些变量声明,因为我可以确保我的XMLHttpRequest正在工作。

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();
}

所以当我调用调用ajax_edit_form_save()的submit_edit_form()时,我得到一个警告'undefined'。我知道问题是ajax_edit_form_save()在readyState 1上返回undefined。我正在挠头,因为我只有在readyState == 4时才返回。我怎么能推迟返回值以便x得到实际值responseText的?

2 个答案:

答案 0 :(得分:3)

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

您应该将回调函数传递给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);

答案 1 :(得分:0)

你从哪个地方获得(x)哪个文件?我想,你忘了提到URL值。