3

setIntervalを使用して AJAX ページの更新を設定しました。サーバーの速度が非常に遅いため、前のリクエストが完了する前に新しいリクエストが開始されることがあります。

どうすればそれを防ぐことができますか?

4

4 に答える 4

6

更新間隔よりも短いタイムアウト値を使用してください。要求がタイムアウトすると、エラー ハンドラーが呼び出されるため、ハンドラーでタイムアウト エラーと他の種類のエラーを区別する必要があります。

 $.ajax({
   type: "POST",
   url: "some.php",
   data: "name=John&location=Boston",
   timeout: 5000, /* ms or 5s */
   success: function(msg){
     alert( "Data Saved: " + msg );
   }
 });

jquery.com のドキュメント。上記の例は同じソースからのものですが、タイムアウト値が追加されています。

于 2009-02-03T21:44:20.510 に答える
2

固定のハードコードされた間隔を使用する代わりに、次の更新を、現在の更新を処理する最後のステップとしてトリガーします。たとえば、「成功」(または「完了」) イベントのコールバックなどです。

動的な遅延を計算できるように、現在のリクエストが送信された時間を追跡する変数を追加できます。

  1. 現在時刻 T1 を取る
  2. 非同期リクエストを送信
  3. 他のことが起こります...
  4. 非同期リクエストが返され、コールバックが実行されます
  5. 現在時刻から T1 を引く
  6. 結果 < 希望するリクエスト間隔の場合、遅延値を設定 > 0
  7. 結果 >= 希望するリクエスト間隔の場合、遅延値を 0 に設定します
  8. 遅延値を指定して setTimeout を呼び出し、次のサイクルを開始します
于 2009-02-03T22:32:27.307 に答える
2

私が言えることは、コードでフラグを使用することです。のように(私が実際に推奨するものではなく、単純な例です)

var isWorking = false;
function doRequest(){
  if(isWorking) return;
  isWorking = true;
  $.ajax({
    ...,
    success: workWithResponse
  });
}

function workWithResponse(){
  /* doAnythingelse */
  isWorking = false;
}

setInterval(doRequest,1000);

そのようなものは原始的ですが、競合状態を回避できます。よろしく。

于 2009-02-03T23:00:26.423 に答える
2

代わりに setTimeout を使用し、AJAX リクエストの結果を受け取った後にのみ別の setTimeout を開始してください。そうすれば、最後の更新から指定された期間が経過した後にのみ更新が行われます。

于 2009-02-03T21:45:10.320 に答える