jQuery: интервал задержки функции ajax до завершения предыдущего запуска - PullRequest
3 голосов
/ 04 февраля 2009

Я установил обновление страницы AJAX с помощью setInterval . Время от времени сервер работает так медленно, что новый запрос инициируется до того, как предыдущий был завершен.

Как я могу предотвратить это?

Ответы [ 4 ]

6 голосов
/ 04 февраля 2009

Используйте значение тайм-аута, которое меньше вашего интервала обновления. Когда время ожидания истекает, он вызывает обработчик ошибок, поэтому вам нужно будет различать ошибки времени ожидания и другие типы ошибок в обработчике.

 $.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. Пример выше из того же источника, но с добавленным значением времени ожидания.

2 голосов
/ 04 февраля 2009

То, что я могу вам сказать, это использовать флаг в вашем коде. Как (не то, что я на самом деле рекомендую, просто пример)

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

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

setInterval(doRequest,1000);

Нечто подобное, это примитивно, но вы избежите условий гонки. Привет.

2 голосов
/ 04 февраля 2009

Вместо использования фиксированного, жестко заданного интервала: запустите следующее обновление как последний шаг обработки текущего, например, в обратных вызовах событий «Success» (или «Complete»).

Вы можете добавить переменную, которая отслеживает время отправки текущего запроса, чтобы можно было рассчитать динамическую задержку:

  1. принять текущее время T1
  2. отправить асинхронный запрос
  3. происходит другое ...
  4. возвращается асинхронный запрос, выполняется обратный вызов
  5. вычесть Т1 из текущего времени
  6. если результат <желаемый интервал запроса, установить значение задержки> 0
  7. если результат> = желаемый интервал запроса, установить значение задержки = 0
  8. вызовите setTimeout со значением задержки, начиная следующий цикл
2 голосов
/ 04 февраля 2009

Вместо этого используйте setTimeout, инициируйте другой setTimeout только после получения результата запроса AJAX. Таким образом, обновление происходит только после указанного периода с момента последнего обновления.

...