2012-02-19 76 views
0

我有一个谷歌浏览器扩展程序,它在按下按钮时执行xmlhttp请求到服务器。如果服务器关闭,我正在处理该错误。我想实现的是在越来越多的秒数后重试请求。我就这样做:xmlhttp请求具有奇怪的行为,并且状态为0

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方法。如果服务器打开,我不知道如何停止这种递归。难道我做错了什么?这个状态是否等于零问题?

非常感谢

+0

您在哪里运行此代码?在内容中,还是在后台页面?什么是完整的代码?您是否已经将该域添加到'manifest.json'的'permissions'部分? – 2012-02-19 15:49:05

+0

是的,域被添加,否则它不能与服务器通信,对吧?此代码在我的扩展的弹出页面中运行。 – Masiar 2012-02-19 16:14:27

回答

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. 
+0

这似乎解决了这个问题。所以我所缺少的是对每一个状态变化触发'onreadystatechange'的知识。也感谢关于'setTimeout'的可爱解释。 – Masiar 2012-02-19 16:52:29

+0

对不起,我刚刚意识到它仍然无法正常工作。看起来即使服务器在上线时收到了一些东西,这段代码仍会继续发送内容,例如,如果总是出现错误并且不断调度'setTimeout'方法。这是因为'status'始终是'!= 200'(如标题所示,总是为零)。 – Masiar 2012-02-19 17:21:37

+0

@Masiar这不是JavaScript代码中的错误,而是服务器端(或者理解它)。您可以通过在'if'块中放置'console.log(xmlhttp.status);'来轻松进行调试。然后,观察控制台,并检查记录的状态码(等)。 – 2012-02-19 17:27:37