tiempo peticiones peticion optimizar llamada funcion espera ejecutar despues ajax request connection-timeout

peticiones - ¿Cuánto tiempo esperará el navegador después de una solicitud de Ajax?



time out javascript ajax (4)

¿Puede explicar un poco más sobre lo que está tratando de lograr? ¿Tiene un proceso de larga ejecución en un servidor, desea cambiar la configuración en una máquina local o está buscando una forma de administrarlo en grandes cantidades? de usuarios?

¿Cuánto tiempo esperará el navegador depende de una serie de factores, por ejemplo, dónde se produce el tiempo de espera, ya sea en el nivel TCP, el servidor o el navegador local?

Si tiene un proceso de larga ejecución en un servidor y luego desea actualizar una página web, la forma más común de manejarlo es ejecutar el largo proceso de forma asincrónica y notificar al cliente cuando esté completo; por ejemplo, tener una llamada ajax que sondee el servidor, o use HTTP 1.1 y envíe un flujo de notificaciones al cliente.

En cualquier caso, aún es posible que la conexión se cierre, por lo que el cliente aún necesitará la posibilidad de volver a abrirla.

¿Cuánto tiempo puede esperar el navegador antes de que se muestre un error antes de que el servidor responda para solicitarlo? ¿Puede ser este tiempo ilimitado?


Descubrí que, en el caso de una solicitud normal (página HTML), los navegadores ejecutan el tiempo de espera después de cca. 30 segundos Es importante, porque otros participantes probablemente lo sigan: proxies, enrutadores (¿los enrutadores juegan en este juego? No estoy seguro). Estoy utilizando una demora de 4 segundos en el lado del servidor (si no hay nada que enviar al cliente) y mi cliente AJAX realiza otra solicitud HTTP de inmediato (estoy en la red local, no hay retraso de Internet). 4 segundos es lo suficientemente largo como para no sobrecargar el servidor y la red con encuestas frecuentes, y es lo suficientemente corto para el caso, cuando de alguna manera una encuesta cae fuera de la fila que el cliente no puede detectar y manejar.

Además, hay otros problemas con el cometa (solicitud HTTP larga): límite del navegador en el número de solicitudes HTTP simultáneas, manejo de eventos del lado del cliente (debe enviarse al servidor de inmediato), detección y recuperación de servidores / redes inactivas, manejo multiusuario etc.


Si está utilizando una llamada jQuery $ .ajax, puede establecer la propiedad de tiempo de espera para controlar la cantidad de tiempo antes de que una solicitud regrese con un estado de tiempo de espera excedido. El tiempo de espera se establece en milisegundos, así que simplemente configúrelo a un valor muy alto. También puede establecerlo en 0 para "ilimitado", pero en mi opinión, debe establecer un valor alto en su lugar.

Nota: ilimitado es en realidad el predeterminado, pero la mayoría de los navegadores tienen tiempos de espera predeterminados que serán afectados.

Cuando se devuelve una llamada ajax debido al tiempo de espera, regresará con un estado de error de "tiempo de espera" que puede manejar con un caso separado si es necesario.

Entonces, si desea establecer un tiempo de espera de 3 segundos, y manejar el tiempo de espera aquí, hay un ejemplo:

$.ajax({ url: "/your_ajax_method/", type: "GET", dataType: "json", timeout: 3000, //Set your timeout value in milliseconds or 0 for unlimited success: function(response) { alert(response); }, error: function(jqXHR, textStatus, errorThrown) { if(textStatus==="timeout") { alert("Call has timed out"); //Handle the timeout } else { alert("Another error was returned"); //Handle other error type } } });​


Si y no. Sí, el servidor puede hacerlo o estar configurado para hacerlo, no los navegadores (no sé sobre los detalles de la versión / distribuidor) pueden tener habilitados los tiempos de espera.

Sin embargo, hay dos soluciones para lograr / emular esto a través de HTTP:

  • Si esto es simple un script de ejecución larga y está esperando resultados, este no es el camino a seguir, debería hacer lo mencionado anteriormente y utilizar el procesamiento asincrónico con el sondeo del servidor para los resultados, esta sería una solución de fuego mucho más segura . Por ejemplo: una secuencia de comandos en miniatura desde el lado del servidor del procesador de imágenes: el usuario carga una imagen, el servidor devuelve un 200 y una "ID de trabajo". El cliente (javascript ^^) puede usar el ID de tarea para solicitar el estado / resultado del trabajo.
  • Si su objetivo es tener algo así como una conexión en tiempo real entre el navegador y el servidor (conexión de 1 vía, una vez que el navegador realiza la solicitud no se puede enviar más información sin utilizar nuevas solicitudes (ajax ^^)), esto se llama larga encuesta / reverse ajax y se puede usar para comunicación en tiempo real a través de http. Existen varias técnicas que utilizan 2 solicitudes largas sondeadas en paralelo, de modo que una vez que una de ellas agota el tiempo de espera, la segunda se activa y la primera intenta volver a conectarse.