質問

3秒ごとに、プロセスのステータスを取得するためにAJAX POSTリクエストを作成します。これはうまく機能します。

プロセスが100%に達すると、コールバック関数が実行され(以下に示す)、ページに新しい要素が追加され、3秒ごとに進行状況を継続的に取得するsetTimeoutメソッドがキャンセルされます。ただし、ユーザーからキャンセルできないことがあり、新しい要素がページに追加されず、「100%」と表示されたままになることがあります。

私はこれを何度もテストしましたが、決して行き詰まりません。コードも問題ないように見えますが、私のJavaScriptスキルはそれほど高くないので、この問題が発生する可能性がある場合、誰かが指摘できることを望んでいましたか?

コードについてコメントしましたが、非常に長い間おaびします。削減しようとしました。

function convertNow(validURL){

    startTime = setTimeout('getStatus();', 6000); 
       //AJAX CALL TO RUN PROCESS
       $.ajax({
       type: "GET",
       url: "main.php",
       data: 'url=' + validURL + '&filename=' + fileNameTxt,
       success: function(msg){
       //ON SUCCESS CLEAR SETTIMEOUT AND SHOW ELEMENTS (text)
       clearTimeout(continueTime);
       clearTimeout(startTime);    
        $("#loading").hide("slow");
        $("#done").html("Done");   
       }//function

     });//ajax

}//function convertNow

function getStatus(){
        //AJAX CALL TO GET STATUS OF PROCESS
        $.ajax({
        type: "POST",
        url: "fileReader.php",
        data: 'textFile=' + fileNameTxt,
        success: function(respomse){
        textFileResponse = respomse.split(" ");
        $("#done").html("Processing...");
        }
        });//ajax
        clearTimeout(continueTime);

        if(textFileResponse[0]=='100.0%'){
            clearTimeout(continueTime);
        }
        else{
            clearTimeout(startTime);
            continueTime = setTimeout('getStatus();', 3000); 
        }
}
役に立ちましたか?

解決

いくつかのエッジケースでは、おそらくtextFileReponse [0] == '100.0%'に解析エラーがあり、応答の値は正確に100.0%に等しくありません(余分な空白があるか、一部のプラットフォームなど...)。これにより、コードがelse {}ブロックに到達し、getStatus関数が再びキューに入れられます。

編集:コメントのスレッドを考えると、Ajaxコードの2つのブロック間で競合状態が発生している可能性も同じです。 (読者の利益のためにこれをここに置くだけです)。編集の終了

ただし、解析の解決に加えておそらく必要なのは、startTimeおよびcontinueTimeタイマーではなく、1つのタイマーのみを使用してsetInterval()を使用することです。 setTimeoutは1回だけ実行されますが、setIntervalはxミリ秒ごとに繰り返されるため、必要なのは1つだけです。 setIntervalをキャンセルするには、clearIntervalを使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top