2010-02-01 10 views
16

Tengo un código jquery en el que estoy usando get() y estoy llamando a alguna URL/archivo remoto. Ahora quiero saber cuál es la mejor manera de manejar los errores de esto.

Lo que estoy haciendo es:

$(document).ready(function() { 
     $.ajaxSetup({ 
      error: function(x, e) { 

       if (x.status == 0) { 
        alert(' Check Your Network.'); 
       } 
        else if (x.status == 404) { 
       alert('Requested URL not found.'); 

       } else if (x.status == 500) { 
        alert('Internel Server Error.'); 
       } else { 
        alert('Unknow Error.\n' + x.responseText); 
       } 
      } 
     }); 

     $.get("HTMLPage.htm", function(data) { 
      alert(data); 
      $('#mydiv').html(data); 

     }); 
    }); 

esto está funcionando fine.But quieren saber ¿hay alguna forma mejor de hacer esto?

ref: http://www.maheshchari.com/jquery-ajax-error-handling/

+0

Ese es un error de manejo de errores AJAX para mí. – RaYell

+1

¿Definir mejor? ¿Qué problema hay con tu código actual que quieres mejorar? –

+0

Si desea mejorar su código, puede dejar de usar alertas y usar funciones que hacen algo más fácil de usar. En realidad, eres el único que quiere ver esta información de error. Puede mostrar una pantalla modal o un pequeño cuadro de texto en algún lugar, indicando al usuario que se produjo un error. –

Respuesta

15

Usando $ .ajaxSetup es global para todas las llamadas ajax. Debido a que la función $ .get no tiene devoluciones de llamada de error, la definición de un controlador de errores en $ .ajaxSetup es la única forma de manejar los errores. Si utiliza $ .ajax, se puede definir el gestor de errores en la llamada $ .ajax como esto

$.ajax({ 
    url: "HTMLPage.htm", 
    success: function(data) { 
    alert(data); 
    $('#mydiv').html(data);   
    }, 
    error: function(XMLHttpRequest, textStatus, errorThrown) { 
    if (XMLHttpRequest.status == 0) { 
     alert(' Check Your Network.'); 
    } else if (XMLHttpRequest.status == 404) { 
     alert('Requested URL not found.'); 
    } else if (XMLHttpRequest.status == 500) { 
     alert('Internel Server Error.'); 
    } else { 
     alert('Unknow Error.\n' + XMLHttpRequest.responseText); 
    }  
    } 
}); 

Esto es específico sólo a esta llamada AJAX, de esa manera se puede tener mensajes de error más específicos. Pero usar el controlador global de errores funciona igual de bien.

Se podría definir sus funciones fuera de la ready ($ (document)) como esto

$(document).ready(function() { 
    $.ajaxSetup({ 
     error: AjaxError 
    }); 

    $.get("HTMLPage.htm", GetSuccess); 
}); 

function AjaxError(x, e) { 
    if (x.status == 0) { 
    alert(' Check Your Network.'); 
    } else if (x.status == 404) { 
    alert('Requested URL not found.'); 
    } else if (x.status == 500) { 
    alert('Internel Server Error.'); 
    } else { 
    alert('Unknow Error.\n' + x.responseText); 
    } 
} 

function GetSuccess(data) { 
    alert(data); 
    $('#mydiv').html(data); 
} 
+1

¡Gracias por escribir una excelente respuesta a esta pregunta! Aprecio especialmente la sugerencia de mover las definiciones de función fuera de la llamada $ .ajaxSetup(). – Steph

1

copiar/pegar desde http://api.jquery.com/jQuery.ajax/:

statusCode (añadido 1,5) {}
Un mapa de códigos HTTP numéricos y funciones para llamar cuando la respuesta tiene el código correspondiente. Por ejemplo, lo siguiente será alertar cuando el estado de respuesta es un 404:

$.ajax({ 
    statusCode: {404: function() { 
    alert('page not found'); 
    } 
}); 

Si la petición tiene éxito, los funciones de código de estado tienen los mismos parámetros que el de devolución de llamada de éxito; si resulta en un error, toman los mismos parámetros que la devolución de llamada de error.

+0

Eso no funciona para mí, la llamada es '$ .ajaxSetup' luego' {statusCode: ...} 'etc. – Diziet

0

A partir de jQuery 1.5, todos los métodos Ajax de jQuery devuelven un superconjunto del objeto XMLHTTPRequest. Este objeto jQuery XHR, o "jqXHR", devuelto por $ .get() implementa la interfaz de Promesa, dándole todas las propiedades, métodos y comportamiento de una Promesa.

var jqxhr = $.get("example.php", function() { 
    alert("success"); 
}) 
.done(function() { 
    alert("second success"); 
}) 
.fail(function() { 
    alert("error"); 
}) 
.always(function() { 
    alert("finished"); 
}); 
Cuestiones relacionadas