xmlhttprequest具有奇怪的行为并且status = 0

时间:2012-02-19 15:31:35

标签: javascript xmlhttprequest

我有一个Google Chrome扩展程序,按下按钮后会向服务器执行xmlhttp请求。如果服务器关闭,我正在处理错误。我想要实现的是在越来越多的秒后重试请求。这就是我的方式:

var execute = function(method, url, i){
            //if timeout doesn't exist, create one
            if(!i){
                i = 1000;
            }

            var xmlhttp = new XMLHttpRequest(); 
            xmlhttp.open(method, url, true);

            xmlhttp.onreadystatechange = function(){
                if (xmlhttp.status != 200)  {
                    // Handle error, retry request
                    console.log("xmlhttp.status = " + xmlhttp.status + " and xmlhttp.readyState = " + xmlhttp.readyState);
                    setTimeout("execute('"+method+"', '"+url+"', "+i*2+")", i);
                    return;
                }
            };

            xmlhttp.send(null);
        }

基本上如果出现某种问题,我会再次重试请求。如果服务器已启动,则完全没有问题,但如果服务器关闭,则JavaScript会向我发出错误消息:

PUT http://localhost:3000/buy/2/id=1329664820124 
executepopup.html:127
(anonymous function)

然而,这并不是真正有意义的。日志中的状态显示为“0”,这也很蹩脚。如果我继续打开服务器,它应该停止这样做,但是如果它成功了(我看到服务器中的一个日志告诉我它收到了请求),它会一直调用{{1 }} 方法。如果服务器开启,我不知道如何停止这种递归。难道我做错了什么?这个状态是否等于问题?

非常感谢

1 个答案:

答案 0 :(得分:4)

解决问题

每个状态更改都会触发

onreadystatechange,从状态0到4,以及之间多次。您应该只对readyState 4感兴趣,因为此时请求已完全完成。
要使您的方法有效,请检查xmlhttp.readyState == 4

xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4 && xmlhttp.status != 200)  {

<小时/>

修复你的setTimeout

的可怕实现

setTimeout("execute('"+method+"', '"+url+"', "+i*2+")", i); 是再次调用函数的正确方法。由于您使用Chrome扩展程序进行开发,因此可以使用以下格式setTimeout

setTimeout(execute, i, method, url, i*2);
// Calls execute(method, url, i*2) after i milliseconds.