2009-03-04 17 views
-1

3秒ごとAJAX POSTリクエストを作成してプロセスのステータスを取得します。これは素晴らしいです。プロセスがページに新しい要素を追加する(下記)の100%コールバック関数が実行に達し、それが連続して3秒ごとに進捗状況を取得するために使用するsetTimeoutメソッドをキャンセルこのJSコードは期待通りに機能しますか?

。しかし、私はユーザーから、時にはキャンセルに失敗し、新しい要素がページに追加されず、「100%」と表示されていたと言われています。

私は何度も何度もこれをテストしてきたし、それは私のために立ち往生れることは決してありません。コードもOKですが、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); 
     } 
} 
+1

"このJSコードは期待通りに機能しますか?" - それはあなたが期待したものに依存すると思います。 – EBGreen

+0

毎回完璧に動作します。 1人または2人のユーザーが「100%」で立ち往生し、「完了」という要素を表示していないと言っています。 – Abs

答えて

4

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

EDIT:コメント内のスレッドを考えると、それはAjaxコードの二つのブロックの間に起こって競合状態があることも等しいlikelyhoodです。 (ちょうど読者の利益のためにここに置く)。 END EDITは

、おそらく欲しい

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

+0

else {}ブロックに行き、プロセスが完了すると、プロセスの成功関数はclearTimeout(continueTime)とclearTimeout(startTime)、そうでしょうか? – Abs

+0

必ずしも... getStatus()とsuccess()は非同期で実行されているため、競合状態に陥る可能性があります。成功のチェックがあると、getStatus()で文字列チェックを取り除くことができます。 getInterval使用する()だけでは成功面積は、それは私が秒の異なる量を持っているので、私は本当にのsetIntervalを使用することはできません問題 –

+0

をチェックせずに間隔を取り消すことができます。また、IEはsetIntervalでうまくいきません。私はsetIntervalがこれをどのように解決するのか分かりません。私はあなたがレースの問題について正しいと思いますが、どのように他のアイデアを修正することができますか? –

関連する問題