Ajax请求正在阻止

时间:2013-09-18 06:26:48

标签: javascript ajax get

我有一个使用服务器执行Ajax请求的功能。代码有效但由于某种原因阻塞了js代码的其余部分。所以我必须等到请求结束。这真的很奇怪,因为ajax本质上是异步的。任何帮助将不胜感激。

这是代码

function initRequest(url)
{ 
    var xmlhttp = null;
    if(xmlhttp != null)
    { 
        if(xmlhttp.abort)
            xmlhttp.abort();
        xmlhttp = null; 
    };

    if(window.XMLHttpRequest) // good browsers 
        xmlhttp=new XMLHttpRequest(); 
    else if(window.ActiveXObject) // IE 
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 

    if(xmlhttp == null)
        return null; 

    xmlhttp.open("GET",url,false); 
    xmlhttp.send(null); 

    if(xmlhttp.status >= 200 && xmlhttp.status < 300)// 2xx is good enough 
    return xmlhttp.responseText.split("|"); 
    else 
        return null; 
}

我这样称呼这个函数     var res = initRequest('someurl');    if(res){console.log(res); }     console.log('当请求被提供时会出现此消息!!为什么?');

3 个答案:

答案 0 :(得分:2)

您应该在XMLHttpRequest对象上实现onreadystatechange回调并检查其中的状态更改,而不是等待阻塞服务器的响应。这个方法将在readyStatus属性的每次更改时被调用,并且在你调用xmlhttp.send(...)之后将(希望)在某个时刻返回200;

编辑:所以你的代码看起来像是

function initRequest(url, onsuccess, onerror) { 
    // ...
    xmlhttp.onreadystatechange = function () {
        if(this.status >= 200 && this.status < 300) {// 2xx is good enough
            onsuccess(this.responseText.split("|"));
        }
    };
    xmlhttp.open("GET", url);  // its asynchronous by default
    xmlhttp.send(null); 
}

为了衡量一些有用的链接 http://www.w3.org/TR/XMLHttpRequest1/https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest

答案 1 :(得分:1)

xmlhttp.open("GET",url,false);中的第三个参数是是否异步发送请求。由于你输入false,它会同步运行,这就是它阻止你的代码的原因。

为了使此异步,您应该将第三个参数更改为true,然后添加一个函数给xmlhttp.onreadystatechange,该函数将作为异步请求的回调(在您调用{之前执行此操作) {1}}。

另一个需要考虑的重要事项是,由于这是异步的,因此您不希望从ajax请求中返回一个值,因为您将等待该返回值,这意味着它将无法获取返回值,或者你必须阻止一切,我们回到原来的问题。因此,考虑一下你想用ajax响应做什么。您可以直接将此代码编码为您分配给.send()的任何内容,或者您​​可以使用闭包将回调传递给它,例如

xmlhttp.onreadystatechange

然后,无论你在哪里调用function initRequest(url, callback) { ... xmlhttp.open("GET",url,true); xmlhttp.onreadystatechange = (function(cb) { return function() { if(xmlhttp.status >= 200 && xmlhttp.status < 300)// 2xx is good enough { cb(xmlhttp.responseText.split("|")); } }; )(callback); xmlhttp.send(null); } ,都要定义一个能对结果做某事的函数,然后将其作为第二个参数传递,例如

initRequest

请告诉我这是否有意义,或者如果您有任何疑问:)

答案 2 :(得分:0)

请将 ajax请求synchronous更改为asynchronous,然后尝试,

发件人,

xmlhttp.open("GET",url,false); 

收件人,

xmlhttp.onreadystatechange = function () {
     if(this.status >= 200 && this.status < 300) {// 2xx is good enough

    }

}
xmlhttp.open("GET",url,true);