質問
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を使用します。