2017-05-07 13 views
0

私は次回のデータベースでの結果を得ようとしています。 XMLHttpRequestを使用してsetIntervalの5秒の遅延でデータを取得しました。要求のステータスが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

あなたの答えにJosephに感謝します。私は本当にそれを感謝します。今、私は再帰タイムアウトを使用するつもりです。 –

関連する問題