-1

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

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

私はこれを何度も何度もテストしました、そしてそれは私のために決して立ち往生しません。コードも問題ないように見えますが、私のJavaScriptスキルはあまり良くないので、この問題が発生する可能性があるかどうか誰かが指摘してくれることを期待していましたか?

私はコードにコメントしました、その非常に長いことをお詫びします。私はそれを減らしようとしました。

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); 
        }
}
4

1 に答える 1

4

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

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

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

于 2009-03-04T19:53:24.613 に答える