2017-05-07 125 views
0

我試圖在數據庫中獲得下一次遊戲結果。我用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 –

回答

1

的問題是,有一個在clearInterval被稱爲可能性和XHR正在等待答覆。當瀏覽器收到響應時,計時器早已消失,但仍需處理響應。

如果您希望您的週期性XHR在啓動另一個之前等待先前的響應,則遞歸setTimeout是更好的選擇。

+0

謝謝約瑟夫的回答。我真的很感激它。現在,我將使用遞歸超時。 –