clearInterval不能与XMLHttpRequest一起使用

clearInterval不能与XMLHttpRequest一起使用

问题描述:

我试图在数据库中获得下一次游戏结果。我用XMLHttpRequest以5s延迟setInterval来获取数据。如果请求的状态是200.代码运行良好。但是,如果状态不是200. clearInterval将不起作用,但console.log仍然有效。clearInterval不能与XMLHttpRequest一起使用

var _resInterval; 
_resInterval = setInterval(function() { 
    var xhr = new XMLHttpRequest(); 
    xhr.open("POST", "/index.php/forms/getDDResult/" + id, true); 
    xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 

    xhr.onload = function() { 
    if (xhr.status === 200) { 
     var _resp = JSON.parse(xhr.responseText); 
     console.log(_resp); 

     if (parseInt(_resp.interval) >= 0) { 
     clearInterval(_resInterval); 
     restartGame(parseInt(_resp.interval)); 
     } 
    } else { 
     console.log("error"); 
     clearInterval(_resInterval); 
    } 
    }; 
    xhr.send(); 
}, 5000); 

UPDATE:递归函数

function getGameResult() { 
    var xhr = new XMLHttpRequest(); 
    xhr.open("POST", "/index.php/forms/getDDResult/" + id, true); 
    xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 

    xhr.onload = function() { 
    if (xhr.status === 200) { 
     var _resp = JSON.parse(xhr.responseText); 
     console.log(_resp); 

     if (parseInt(_resp.interval) >= 0 && _resp.result != "Not available") { 
     restartGame(parseInt(_resp.interval)); 
     } else { 
     setTimeout(function() { 
      getGameResult(); 
     }, 5000); 
     } 
    } 
    }; 
    xhr.send(); 
} 

我做正确的方式还是应该将其更改为递归函数?谢谢。

- 拉拉

+0

你是什么意思的“clearInterval不会工作”? –

+0

@EvanTrimboli嗨,感谢您给我的问题留下时间。 clearInterval将停止setInterval,对吗?它不会停止运行代码。我不确定使用递归函数是否适合这种情况,但递归对我来说效果很好。等待一些JavaScript英雄分享知识:D –

的问题是,有一个在clearInterval被称为可能性和XHR正在等待答复。当浏览器收到响应时,计时器早已消失,但仍需处理响应。

如果您希望您的周期性XHR在启动另一个之前等待先前的响应,则递归setTimeout是更好的选择。

+0

谢谢约瑟夫的回答。我真的很感激它。现在,我将使用递归超时。 –