Javascript xmlhttp请求的行为异常,状态为0

Javascript xmlhttp请求的行为异常,状态为0,javascript,xmlhttprequest,Javascript,Xmlhttprequest,我有一个GoogleChrome扩展,按下一个按钮,就会向服务器执行一个xmlhttp请求。如果服务器关闭,我当前正在处理错误。我想要实现的是在增加秒数后重试请求。我就是这样做的: var execute = function(method, url, i){ //if timeout doesn't exist, create one if(!i){ i = 1000; }

我有一个GoogleChrome扩展,按下一个按钮,就会向服务器执行一个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”,这也很糟糕。如果在此过程中再次打开服务器,它应该停止这样做,但如果它成功(我在服务器中看到一个日志,告诉我它收到了请求),它会继续调用
execute
方法。如果服务器打开,我不知道如何停止这种递归。我做错什么了吗?这个状态等于零吗

非常感谢您解决了这个问题
onreadystatechange
会为每个状态更改触发,从状态0到状态4,以及在状态0到状态4之间多次触发。您应该只对
readyState
4感兴趣,因为此时请求已完全完成。
要使方法正常工作,请检查
xmlhttp.readyState==4

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

修复setTimeout的可怕实现
setTimeout(“执行”(“+method+”,“+url+”,“+i*2+”),i)
不是再次调用函数的正确方法。由于您是在Chrome扩展中开发的,因此可以对
setTimeout
使用以下格式:

setTimeout(execute, i, method, url, i*2);
// Calls execute(method, url, i*2) after i milliseconds.
解决问题
onreadystatechange
会为每个状态更改触发,从状态0到状态4,以及在状态0到状态4之间多次触发。您应该只对
readyState
4感兴趣,因为此时请求已完全完成。
要使方法正常工作,请检查
xmlhttp.readyState==4

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

修复setTimeout的可怕实现
setTimeout(“执行”(“+method+”,“+url+”,“+i*2+”),i)
不是再次调用函数的正确方法。由于您是在Chrome扩展中开发的,因此可以对
setTimeout
使用以下格式:

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

您在哪里运行此代码?在contentscript中,还是在后台页面中?完整代码是什么?您是否已将域添加到
manifest.json
权限
部分?是的,已添加域,否则它无法与服务器通信,对吗?此代码在“我的扩展”的弹出页面中运行。您在哪里运行此代码?在contentscript中,还是在后台页面中?完整代码是什么?您是否已将域添加到
manifest.json
权限
部分?是的,已添加域,否则它无法与服务器通信,对吗?这段代码在我的扩展的弹出页面中运行。这似乎解决了问题。因此,我所缺少的知识是,
onreadystatechange
会为每个状态更改触发。还感谢您对
setTimeout
的有趣解释。对不起,我刚刚意识到它仍然不起作用。看起来,即使服务器在启动时接收到一些内容,代码段也会不断发送内容,就像总是出现错误并不断调度
setTimeout
方法一样。这是因为
状态总是
!=200
(如标题所示,始终为零)。@Masiar这不是JavaScript代码中的错误,而是服务器端的错误(或理解错误)。您可以通过放置
console.log(xmlhttp.status)轻松调试它
if
块中。然后,观察控制台,检查记录的状态代码(etc)。我知道如何使用console.log()
:)谢谢。至少这部分代码是正确的。这似乎解决了问题。因此,我所缺少的知识是,
onreadystatechange
会为每个状态更改触发。还感谢您对
setTimeout
的有趣解释。对不起,我刚刚意识到它仍然不起作用。看起来,即使服务器在启动时接收到一些内容,代码段也会不断发送内容,就像总是出现错误并不断调度
setTimeout
方法一样。这是因为
状态总是
!=200
(如标题所示,始终为零)。@Masiar这不是JavaScript代码中的错误,而是服务器端的错误(或理解错误)。您可以通过放置
console.log(xmlhttp.status)轻松调试它
if
块中。然后,观察控制台,检查记录的状态代码(etc)。我知道如何使用console.log()
:)谢谢。至少这部分代码是正确的。