异步xmlhttprequests失败,同步不是

时间:2010-07-12 06:26:35

标签: javascript ajax xmlhttprequest

我遇到了一个奇怪的问题。在下面的示例代码中,如果我将asynchronous设置为true,则请求失败,Chrome会告诉我“无法加载资源”。但是,如果我将其切换为同步,则会很好。

此外,如果我使用此代码执行多个xhr请求并将其设置为异步,则所有请求都会出现相同的问题,但最后一个请求成功。如果我将xhr设置为同步(即假),那么所有请求都会很好。

对于所有会说“只使用jQuery”的人来说,这是一个需要独立于任何库运行的项目。我喜欢jQuery,但不喜欢这个。

我正在Chrome6.0.458.1和Firefox 3.6.4中对此进行测试。这是代码:

    var xhr = window.XMLHttpRequest?
        new XMLHttpRequest():
        new ActiveXObject('Microsoft.XMLHTTP');

    var doxhr = function(url,cb){
        xhr.open('get',url,true);
        xhr.onreadystatechange = function(ev){
            console.log(xhr.readyState, xhr.status );
            //if(xhr.readyState === 4 && xhr.status === 200){
            //  cb(xhr.responseText);
            //}
        }
        xhr.send(null);
    }

1 个答案:

答案 0 :(得分:4)

我不确定这两个问题是否相关,但是如果您计划发出多个XHR请求,则不应该为每个请求重复使用相同的XHR,否则您应该构建一个排队系统来阻止以后的请求踩踏要求。您可以通过将xhr包裹在doxhr()内来解决仅成功完成上一次请求的问题:

var doxhr = function(url,cb){
    var xhr = window.XMLHttpRequest?
        new XMLHttpRequest():
        new ActiveXObject('Microsoft.XMLHTTP');
        xhr.open('get',url,true);
    xhr.onreadystatechange = function(ev){
        console.log(xhr.readyState, xhr.status );
        //if(xhr.readyState === 4 && xhr.status === 200){
        //  cb(xhr.responseText);
        //}
    }
    xhr.send(null);
}