Pregunta

He creado una página de actualización de AJAX con setInterval . De vez en cuando, el servidor es tan lenta que una nueva petición se inicia antes de que la anterior haya completado.

¿Cómo puedo evitar eso?

¿Fue útil?

Solución

Utilice un valor de tiempo de espera es más corto que el intervalo de actualización. Cuando los tiempos de espera de solicitud, se llamará al gestor de errores por lo que necesitará para diferenciar entre el tiempo de los errores y de otros tipos de errores en el controlador.

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

Docs en jquery.com. Ejemplo anterior de misma fuente, pero con el valor de tiempo de espera adicional.

Otros consejos

Uso setTimeout lugar, iniciar otra setTimeout sólo después de recibir el resultado de la petición AJAX. De esta manera una actualización sólo ocurre después del período especificado desde la última actualización.

En lugar de utilizar una, intervalo codificado duro fijo: desencadenar la siguiente actualización como el último paso de manejar la actual, por ejemplo, en el "éxito" (o "completo") devoluciones de llamada de evento.

Se podría añadir una variable que realiza un seguimiento del tiempo de la petición actual fue enviado, por lo que se puede calcular un retraso dinámica:

  1. tomar tiempo actual T1
  2. enviar solicitud asíncrona
  3. otras cosas que pasan ...
  4. solicitud asincrónica devoluciones, se ejecuta de devolución de llamada
  5. restar T1 de tiempo actual
  6. si el resultado 0
  7. si el resultado> = su solicitud intervalo, ajustar el valor de retardo deseado = 0
  8. setTimeout llamada con el valor de retardo, iniciar el siguiente ciclo

Lo que puedo decir es, el uso de una bandera en el código. Al igual (no es lo que realmente recomiendo sólo un ejemplo sencillo)

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

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

setInterval(doRequest,1000);

Algo así, su primitivo, pero se evitan las condiciones de carrera. Saludos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top