2012-05-01 12 views
6

Tengo una llamada ajax para algunos datos (usando jQuery). después de que el usuario hace clic en "enviar" (y se ha enviado la llamada ajax), estoy mostrando un mensaje "Espere ..." que desactiva todo hasta que la solicitud vuelva (para que el usuario no haga doble clic o haga clic en otras cosas y en el lío cosas claras).Cómo manejar la llamada ajax cuando no hay respuesta del servidor

Funciona muy bien cuando hay algún tipo de error - el "Por favor espere ..." desaparece y estoy mostrando al usuario lo que salió mal.

Pero, ¿qué sucede si el servidor no me devuelve nada debido a un error de comunicación?

La solución que encontré para esto es para establecer un tiempo de espera de 10 segundos para el mensaje "Por favor espere .." que después de que el tiempo desaparece y muestra y el error de que "La comunicación no se pudo". Supongo que si el servidor no respondió después de 10 segundos, entonces no responderá en absoluto, sino que es una suposición falsa.

El problema es - ¿cómo puedo estar seguro de que después de 20 segundos el servidor no devolverá algo? El escenario que podría ocurrir es que el usuario haga clic en enviar -> 10 segundos después recibe un mensaje de error -> 5 segundos más tarde la respuesta del servidor y confunde al usuario

¿Cómo me aseguro de que después de ocultar el "Por favor" esperar ... "¿no aparecerá nada del servidor?

Respuesta

2

cuando envía una solicitud a un servidor. se abre una conexión y se mantiene abierta a menos que el servidor responda.
1.si debido a algún error en el servidor no puede responder, se envía un código de respuesta de 5xx en general (503)
2.si debido a algunos problemas de conexión la conexión finaliza prematuramente, también jquery tomaría eso como un error

1.so si quiere esperar a que el servidor envíe una solicitud o la terminación de la conexión (lo que ocurra antes) puede usar la opción completed en el jquery ajax.
2.y si se encuentra en una condición en la que el servidor no responde incluso después de 20 segundos y cree que debería haber respondido, agote el tiempo de espera.
3.finalmente, si su problema es que está utilizando algún rey de servidor http personalizado hecho a mano que solicite finalizar una solicitud incluso si encuentra algún error, entonces al menos personalícelo enuf para que devuelva algún código de respuesta (porque este es el modelo HTTP de solicitud y respuesta)

2

Puede manejar algo como esto

if (request.readyState == 4){ // 4 is "complete" 
    if (request.status == 200){ 
    // HTTP OK, carry out your normal Ajax processing 
    // ... 
    }else{ 
    // something went wrong, report the error 
    error("HTTP "+request.status+". An error was » 
      encountered: "+ request.statusText); 
    } 
} 

(o)

$.ajax({ 
    type: "post", 
    url: "somepage.html", 
    success: function (data, text) { 
     //... 
    }, 
    error: function (request, status, error) { 
     alert(request.responseText); 
    } 
}); 
+2

¿Cómo soluciona esto el problema en la pregunta de alguna manera? –

+0

gracias por la respuesta, pero mi pregunta fue sobre qué sucede cuando el servidor no envía nada, y si es posible que pueda suceder. – Alon

1
  • Generar un único token cuando el fuego una solicitud,
  • mantener una lista de símbolos válidos,
  • eliminar tokens cuando la solicitud agota el tiempo de espera/falla,
  • compruebe si el token sigue siendo válido antes de ejecutar devoluciones de llamadas de éxito/error.

El mismo patrón se puede adaptar para una situación en la que necesite enviar solicitudes repetitivas frecuentes (por ejemplo, autocompletado/filtrado de resultados) y solo debe disparar el último controlador.

Cuestiones relacionadas