web-dev-qa-db-fra.com

jQuery: gérer le remplacement en cas d'échec AJAX Request

JQuery peut-il fournir une solution de rechange pour les appels ayant échoué AJAX? Voici mon essai:

function update() {
    var requestOK = false;

    $.getJSON(url, function(){
        alert('request successful');
        requestOK = true;
    });

    if (!requestOK) {
        alert('request failed');
    }
}

Malheureusement, même si la fonction de rappel de la méthode $ .getJSON () est appelée, j'obtiens le message "request failed", avant que la fonction de rappel n'ait la possibilité de définir la variable requestOK. Je pense que c'est parce que le code fonctionne en parallèle. Existe-t-il un moyen de gérer de telles situations? J'ai pensé au chaînage ou à un moyen d'attendre la demande AJAX, y compris sa fonction de rappel. Mais comment? Quelqu'un sait-il comment faire cela?

37
Patrick Oscity

Vous devrez soit utiliser le niveau inférieur $. Ajax call, soit la fonction ajaxError . Le voici avec la méthode $ .ajax:

function update() {
  $.ajax({
    type: 'GET',
    dataType: 'json',
    url: url,
    timeout: 5000,
    success: function(data, textStatus ){
       alert('request successful');
    },
    fail: function(xhr, textStatus, errorThrown){
       alert('request failed');
    }
  });
}

[~ # ~] modifier [~ # ~] J'ai ajouté un timeout au $.ajax appelez et réglez-le sur cinq secondes.

75
Doug Neiner

La réponse de Dougs est correcte, mais vous pouvez réellement utiliser $.getJSON et intercepter les erreurs (ne pas avoir à utiliser $.ajax). Il suffit de chaîner l'appel getJSON avec un appel à la fonction fail:

$.getJSON('/foo/bar.json')
    .done(function() { alert('request successful'); })
    .fail(function() { alert('request failed'); });

Démo en direct: http://jsfiddle.net/NLDYf/5/

Ce comportement fait partie de l'interface jQuery.Deferred.
Fondamentalement, il vous permet d'attacher des événements à une action asynchrone après l'appel de cette action, ce qui signifie que vous n'avez pas à passer fonction d'événement à l'action.

En savoir plus sur jQuery.Deferred ici: http://api.jquery.com/category/deferred-object/

9

Oui, il est intégré à jQuery. Voir la documentation sur documentation jquery .

ajaxError peut être ce que vous voulez.

2
Jonathon Faust

Je préfère cette approche car vous pouvez renvoyer la promesse et utiliser .then (successFunction, failFunction); partout où vous en avez besoin.

var promise = $.ajax({
    type: 'GET',
    dataType: 'json',
    url: url,
    timeout: 5000
  }).then(function( data, textStatus, jqXHR ) {
    alert('request successful');
  }, function( jqXHR, textStatus, errorThrown ) {
    alert('request failed');
});

//also access the success and fail using variable
promise.then(successFunction, failFunction);
1
thebaron24

Je crois que ce que vous recherchez est une option d'erreur pour le jquery objet ajax

getJSON est un wrapper pour le $.ajax objet, mais il ne vous donne pas accès à l'option d'erreur.

EDIT: dcneiner a donné un bon exemple du code que vous auriez besoin d'utiliser. (Même avant de pouvoir poster ma réponse)

1
Sean Vieira