Question

Peut-jQuery fournir une solution de repli pour les appels AJAX a échoué? Ceci est 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, je reçois le message « demande a échoué », avant que la fonction de rappel a la possibilité de définir la variable requestOK. Je pense qu'il est parce que le code fonctionne en parallèle. Est-il un moyen de gérer de telles situations? Je pensais à enchaînant ou d'une certaine façon d'attendre la requête AJAX, y compris sa fonction de rappel. Mais comment? Est-ce que quelqu'un sait comment faire?

Était-ce utile?

La solution

Vous devrez soit utiliser le niveau inférieur $ .ajax appel, ou la fonction ajaxError . Ici, il est 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');
    }
  });
}

EDIT J'ai ajouté un timeout à l'appel $.ajax et mis à cinq secondes.

Autres conseils

Dougs réponse est correcte, mais vous pouvez réellement utiliser des erreurs $.getJSON et attraper (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 de joindre des événements à une action asynchrone après vous appelez cette action, ce qui signifie que vous ne devez pas passer la fonction d'événement à l'action.

En savoir plus sur jQuery.Deferred ici: http://api.jquery.com/category / report d'objet /

Oui, il est construit pour jQuery. Voir la documentation jquery documentation .

ajaxError peut être ce que vous voulez.

Je crois que ce que vous cherchez est l'option d'erreur pour le jquery ajax objet

getJSON est une enveloppe à l'objet $.ajax, mais il ne vous permet pas d'accéder à l'option d'erreur.

EDIT: dcneiner a donné un bon exemple du code que vous devez utiliser. (Même avant que je puisse poster ma réponse)

Je préfère cette approche parce que vous pouvez retourner la promesse et l'utilisation .alors (successFunction, failFunction); partout où vous 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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top