90 votes

Jquery Ajax gestion d'erreur de l'ignorer abandonnée

Je veux avoir une erreur globale de la méthode de gestion pour les appels ajax, c'est ce que j'ai maintenant:

$.ajaxSetup({
  error: function (XMLHttpRequest, textStatus, errorThrown) {
    displayError();
  }
});

J'ai besoin d'ignorer l'erreur de aborted. errorThrown est nulle et textStatus est error. Comment puis-je vérifier pour aborted?

57voto

bluecollarcoder Points 430

J'ai eu à traiter avec le même cas d'utilisation aujourd'hui. L'application que je suis en train de travailler sur ces longue appels ajax qui peut être interrompu par 1) l'utilisateur de naviguer à l'extérieur ou 2) une sorte de temporaire de connexion ou de panne du serveur. Je veux le gestionnaire d'erreur pour s'exécuter uniquement pour de connexion ou de panne du serveur et non pas pour l'utilisateur de naviguer à l'extérieur.

J'ai d'abord essayé Alastair Pitts réponse, mais il ne fonctionne pas parce que les deux abandonnée demandes de connexion et de l'échec de l'état code et readyState à 0. Ensuite, j'ai essayé sieppl réponse; aussi n'a pas fonctionné car dans les deux cas, aucune réponse n'est donnée, donc pas d'en-tête.

La seule solution qui a fonctionné pour moi est de définir un écouteur pour fenêtre.onbeforeunload, qui définit une variable globale pour indiquer que la page a été déchargé. Le gestionnaire d'erreur pouvez ensuite vérifier et appeler le gestionnaire d'erreur uniquement si la page n'a pas été déchargé.

var globalVars = {unloaded:false};
$(window).bind('beforeunload', function(){
    globalVars.unloaded = true;
});
...
$.ajax({
    error: function(jqXHR,status,error){
        if (globalVars.unloaded)
            return;
    }
});

22voto

Alastair Pitts Points 11677

Quelque chose que j'ai trouvé, c'est que quand il y a une demande abandonnée, l' status et/ou readyState égal 0.

Dans mon gestionnaire d'erreurs globales, j'ai une case en haut de la méthode:

$(document).ajaxError(function (e, jqXHR, ajaxSettings, thrownError) {
    //If either of these are true, then it's not a true error and we don't care
    if (jqXHR.status === 0 || jqXHR.readyState === 0) {
        return;
    }

    //Do Stuff Here
});

J'ai trouvé cela fonctionne parfaitement pour moi. Espérons que cette aide vous, ou quelqu'un d'autre qui va :)

11voto

Paul Rademacher Points 2194

Vous aurez envie de regarder à la textStatus argument passé dans la fonction d'erreur. Selon http://api.jquery.com/jQuery.ajax/, il peut prendre les valeurs "succès", "notmodified", "erreur", "délai d'attente", "abandon", ou "parsererror". "abort" c'est bien évidemment ce que vous voulez vérifier.

Des notes plus longues ici: jquery-gotcha-erreur-rappel-déclenché-sur-xhr-abort

5voto

Sano J Points 204

Parce que bluecollarcoders réponse ne fonctionne pas pour les requêtes ajax abandonnée par javascript, voici ma solution:

var unloaded = false;
...
$(window).bind('beforeunload', function(){
    unloaded = true;
});


$(document).ajaxError(function(event, request, settings) {
    if (unloaded || request.statusText == "abort") {
        return;
    }
    ...
}

par exemple

handler = jQuery.get("foo")
handler.abort()

va maintenant être ignoré par ajaxError gestionnaire

3voto

Leniel Macaferi Points 38324

Bâtiment sur Alastair Pitts a la réponse, vous pouvez également le faire pour avoir plus de messages informatifs:

$(document).ajaxError(function (e, jqXHR, ajaxSettings, thrownError)
{
    {
        if (jqXHR.status === 0)
        {
            alert('Not connect.\n Verify Network.');
        } else if (jqXHR.status == 404)
        {
            alert('Requested page not found. [404]');
        } else if (jqXHR.status == 500)
        {
            alert('Internal Server Error [500].');
        } else if (exception === 'parsererror')
        {
            alert('Requested JSON parse failed.');
        } else if (exception === 'timeout')
        {
            alert('Time out error.');
        } else if (exception === 'abort')
        {
            alert('Ajax request aborted.');
        } else
        {
            alert('Uncaught Error.\n' + jqXHR.responseText);
        }
    }
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X