96 votes

JQuery Ajax - Comment Détecter une erreur de Connexion Réseau lors de la prise de appel Ajax

J'ai un peu de Javascript (JQuery code qui fait un appel Ajax vers le serveur toutes les 5 minutes, c'est de garder la session sur le serveur en vie et garder la connexion de l'utilisateur. Je suis à l'aide d' $.ajax() méthode JQuery. Cette fonction semble avoir une "erreur" de la propriété que je suis en train d'utiliser, dans le cas où l'utilisateur de la connexion internet va vers le bas de sorte que le KeepAlive script continue à s'exécuter. Je suis en utilisant le code suivant:

var keepAliveTimeout = 1000 * 10;

function keepSessionAlive()
{
    $.ajax(
    {
        type: 'GET',
        url: 'http://www.mywebapp.com/keepAlive',
        success: function(data)
        {
            alert('Success');

            setTimeout(function()
            {
                keepSessionAlive();
            }, keepAliveTimeout);
        },
        error: function(XMLHttpRequest, textStatus, errorThrown)
        {
            alert('Failure');

            setTimeout(function()
            {
                keepSessionAlive();
            }, keepAliveTimeout);
        }
    });
}

Quand je le lance, je vais obtenir le Succès " qui s'affiche sur l'écran dans une boîte d'alerte toutes les 10 secondes, ce qui est bien. Cependant, dès que je l'ai débrancher le câble réseau, je ne reçois rien, je m'attendais à la fonction d'erreur pour obtenir de l'appelé et de voir un "Échec" zone d'alerte, mais rien ne se passe.

Suis-je raison de supposer que la "erreur" fonction est uniquement à des fins non '200' état de codes renvoyés par le serveur? Est-il un moyen de détecter des problèmes de connexion réseau lors d'un appel Ajax?

13voto

Krule Points 4374

Vous devez juste ajouter: timeout: <number of miliseconds>, quelque part en $.ajax({}). Aussi, cache: false, peut aider dans certains scénarios.

$.ajax est bien documenté, vous devez vérifier les options, pourrait trouver quelque chose d'utile.

Bonne chance!

9voto

Marco Z Points 343

Puisque je ne peux pas reproduire le problème, je ne peux que suggérer d'essayer avec un délai de l'appel ajax. En jQuery, vous pouvez le définir à l' $.ajaxSetup (et il sera globales pour tous vos $.les appels ajax) ou vous pouvez régler précisément de votre appel, comme ceci:

$.ajax({
type: 'GET',
url: 'http://www.mywebapp.com/keepAlive',
timeout: 15000,
success: function(data) {},
error: function(XMLHttpRequest, textStatus, errorThrown) {}
})

jQuery va l'inscrire à 15 secondes sur votre appel; après que, sans un code de réponse http du serveur jQuery vais exécuter l'erreur de rappel avec le textStatus valeur fixée à "timeout". Avec cela, vous pouvez au moins arrêter l'appel ajax, mais vous ne serez pas en mesure de différencier le réel de problèmes de réseau à partir de la perte de connexions.

3voto

Geoff Points 131

Ce que je vois dans ce cas, c'est que si je tire de l'ordinateur client câble de réseau et de faire l'appel, l'ajax succès gestionnaire est appelé (pourquoi, je ne sais pas), et les données de paramètre est une chaîne vide. Donc, si vous facteur de la vraie erreur de manipulation, vous pouvez faire quelque chose comme ceci:

function handleError(jqXHR, textStatus, errorThrown) {
    ...
}

jQuery.ajax({
    ...
    success: function(data, textStatus, jqXHR) {
        if (data == "") handleError(jqXHR, "clientNetworkError", "");
    },
    error: handleError
});

1voto

Swapnil Rebello Points 32

Si vous faites de la croix-domaine d'appel l'Utilisation Jsonp. d'autre l'erreur n'est pas retourné.

-6voto

MaikL80 Points 155

Avez-vous essayé?

$(document).ajaxError(function(){ alert('error'); }

Qui doit gérer tous les AjaxErrors. Ive a trouvé ici. Vous y trouverez également une possibilité d'écrire ces erreurs de votre console de firebug.

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