2012-06-15 10 views
16

Envío de muchos datos usando el método jquery ajax al servidor web y el cliente responde solo después de recibir acuse de recibo del servidor, ahora supongo que la conexión de red se perdió en el MEDIO de la llamada ajax y luego detectar esta situaciónCómo detectar la falla de llamada Ajax debido a una red desconectada

$.ajax({ 
     url:'server.php', 
     data:'lots of data from 200KB to 5MB', 
     type:'post', 
     success: function(data) 
        { 
         alert('Success'); 
         //some stuff on success 

        }, 
      error: function(XMLHttpRequest, textStatus, errorThrown) 
        { 
         alert('Failure'); 
         //some stuff on failure 
        } 
     }); 

Este es mi código y y no da error en medio de la llamada AJAX si conseguir Internet está desconectado.

NOTA: No puedo utilizar el tiempo de espera porque el tamaño de los datos varía de 200kb a 5MB y el cálculo del tiempo de respuesta del servidor no es factible.

+1

'alerta()' 'la textStatus' y' errorThrown' y vea cómo cambian para diferentes tipos de falla. Debería poder encontrar los códigos apropiados. – Blender

+0

Consulte http://stackoverflow.com/questions/189430/javascript-how-to-detect-that-the-internet-connection-is-offline y http://stackoverflow.com/questions/1730692/jquery-ajax -how-to-detect-network-connection-error-when-making-ajax-call – gopi1410

+0

@Blender cuando la red está desconectada, entonces no ocurre ningún cambio en ningún argumento y no entra en la función de error ... –

Respuesta

0

Intente agregar tiempo de espera: mientras construye su $ .ajax ({}).

También asegúrese de configurar el caché: falso, a veces útil.

Consulte ajax de jQuery(): http://api.jquery.com/jQuery.ajax/#toptions

obtendrá mucha más información allí!

Mi pensamiento s sobre su problema [actualizada]

@RiteshChandora, entiendo su preocupación aquí. Como siempre te sugiero que hagas 2 cosas.

  1. Como tiene datos de publicación que van desde 200kb a 5mb, es posible que desee elegir un tiempo de espera máximo. y disparador para lo mismo. Sí, esto podría ser problemático, pero con el diseño que eligió, la única forma de supervisar el progreso POST es hacerlo de esta manera. si no, vea el punto 2.

  2. Revisé el flujo, le está pidiendo al usuario que copie la respuesta Json de FB a su url. Hay algunos problemas aquí,

  3. Los datos json tienen información confidencial sobre el usuario y la está publicando en una url sin encriptación SSL.

  4. ¿Por qué debe pedirle al usuario que publique los datos adquiridos en su servidor? debería ser más fácil si usa secuencias de comandos laterales. Además, nunca debería publicar datos enormes del cliente en el servidor en ocasiones como esta, donde podría recuperar el mismo formulario que FBserver-> su servidor en el lado del servidor.

Mi propuesta de solución: Una vez autenticado el usuario, recuperar a su lista de amigos en el lado del servidor. haga lo que quiera del lado del servidor y visualice el resultado en la pantalla de los usuarios.

De esta forma, su servidor se hará cargo de toda la carga, y no es necesario que el usuario haga ninguna publicación desagradable de json en su url.

Por cierto, la idea de su aplicación es genial.

+0

Ya mencioné en Pregunta que no puedo usar la opción de tiempo de espera. no es posible averiguar el tiempo de espera adecuado. –

+0

Rajesh Ya menciono en la Pregunta que no puedo usar la opción de tiempo de espera. –

+0

Lo siento, me perdí tu nota sobre el tiempo de espera. ¿Puedes intentar atrapar el error Twrown?"NO SE ENCUENTRA" cuando no se encuentra el servidor. ¿No puedes disparar el error Thrown para NOT FOUND? aquí: http://jsfiddle.net/epinapala/y4cva/ –

-5
error: function(xhr, textStatus, thrownError) 
        { 
         alert(xhr.status); 
         alert(thrownError); 
         alert(textStatus); 

        } 

Trate de ellos .. TextStatus (además nula) son "tiempo de espera", "error", "abortar", y "parsererror". Cuando se produce un error HTTP, throwwnError recibe la parte textual del estado HTTP, como "No encontrado" o "Error interno del servidor"."

Si se desconecta de Internet, la respuesta suele ser recibidas y máxima sería un mensaje de tiempo de espera ..

+0

Algunas referencias ... http: //api.jquery.com/jQuery.ajax/ y http://api.jquery.com/ajaxError/ –

+2

La respuesta que sugiere funciona solo cuando el servidor responde algo .. Pero mi pregunta si la llamada Ajax se cancela en medio de la finalización, entonces cómo detectar esa situación. Quiero darle un mensaje a un usuario y retroceder a la situación anterior. –

3

Si el servidor no estaba muy lleno, probablemente podría utilizar un temporizador para empezar a detectar la conexión con regularidad cuando comience a transferir los datos (usando otra llamada ajax, por ejemplo cada 5 segundos). Ahora puede usar timeout.

Btw, 1) el tiempo de espera no siempre significa un error de red.

2) si el controlador está inactivo en el dispositivo del cliente, xhr.sta tus = 0, y sin tiempo de espera

2

Me enfrenté a una situación similar a la tuya y la solucioné al tener una verificación de red por cada 5 segundos y si se desconecta la red abortaría manualmente la solicitud ajax que finalizará la solicitud de ajax.

Aquí obtengo el ajax XmlHttpRequest en el evento beforeSend de la llamada Jquery ajax y uso ese objeto para abortar la solicitud de ajax en caso de falla de la red.

var interval = null; 
var xhr = null; 

$.ajax({ 
    beforeSend: function(jqXHR, settings) { 
      xhr = jqXHR; // To get the ajax XmlHttpRequest 
    }, 
    url:'server.php', 
    data:'lots of data from 200KB to 5MB', 
    type:'post', 
    success: function(data) 
       { 
        alert('Success'); 
        //some stuff on success 

       }, 
     error: function(XMLHttpRequest, textStatus, errorThrown) 
       { 
        alert('Failure'); 
        //some stuff on failure 
       }, 
     complete: function(data) 
       { 
        alert('Complete'); 
        //To clear the interval on Complete 
        clearInterval(interval); 
       }, 
    }); 

interval = setInterval(function() { 
    var isOnLine = navigator.onLine; 
     if (isOnLine) { 
      // online 
     } else { 
      xhr.abort(); 
     } 
    }, 5000); 
5

Prueba esto:

En primer lugar crear un "ping" llamada AJAX con setInterval cada 5 segundos

function server_ping() 
    { 
     $.ajax({ 
      url:"url to ping", 
      type: "POST" 
     }); 
    } 
    var validateSession = setInterval(server_ping, 5000); 

luego armar su trampa .ajaxError:

$(document).ajaxError(function(event, request, settings) { 
     //When XHR Status code is 0 there is no connection with the server 
     if (request.status == 0){ 
      alert("Communication with the server is lost!"); 
     } 

    }); 

Recuerde Ajax las llamadas son asíncronas por defecto, por lo que cuando los pings van al servidor y la solicitud no puede llegar al servidor El valor en el estado XHR es 0, y el .ajaxError se disparará y usted debe detectar el error y manejarlo de la manera que lo desee.

Luego puede enviar sus datos al servidor, si la conexión se pierde al enviar los datos, recibe el error informado por el ping.

2

que tenía un problema similar y lo resolvió con un try simpelemente/captura y un retraso volver a intentarlo de (digamos) 2 segundos:

function myAjaxMethod() 
{ 
    try 
    { 
    $.ajax({ ... }); 
    } catch (err) 
    { 
    console.log(err.message); 
    setTimeout(function(){myAjaxMethod(),2000}); 
    } 
} 
Cuestiones relacionadas