代码之家  ›  专栏  ›  技术社区  ›  Adam Tootle

Ajax只返回readystate==4值

  •  1
  • Adam Tootle  · 技术社区  · 15 年前

    好吧,我到处都找过这个。我将删除几个变量声明,因为我可以确保我的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();
    }
    

    所以,当我调用submit_edit_form(),它调用ajax_edit_form_save(),我会得到一个“未定义”的警告。我知道问题在于Ajax_Edit_Form_Save()在ReadyState1上返回未定义的。我抓耳挠腮,因为只有当readystate==4时才有返回。我怎样才能推迟返回值,以便x得到实际的responseText?

    2 回复  |  直到 15 年前
        1
  •  3
  •   naikus    15 年前

    您的函数甚至在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);
    
        2
  •  0
  •   PPShein    15 年前

    你从哪里得到的那个(X)文件?我想,你忘了提URL值了。