2010-12-09 3 views
4

J'envoie des données au serveur en petites rafales en utilisant la fonction jQuery ajax. Chaque bloc de données est une simple carte de valeur-clé (la propriété data transmise à la fonction ajax).Comment associer un résultat d'erreur Ajax à la requête d'origine?

En cas d'échec d'une demande, comment mon gestionnaire d'événements d'erreur peut-il identifier dont n'a pas pu être chargé?

La signature de la fonction du gestionnaire d'erreur jQuery est:

error(XMLHttpRequest, textStatus, errorThrown) 

Ni textStatus ou errorThrown semble utile d'identifier l'ensemble des données a échoué, et la XHR ne semble pas offrir cette capacité soit.

En termes simples, si une demande échoue, je veux être en mesure d'obtenir la propriété id du data que j'ai transmise à la fonction ajax. Comment puis-je faire ceci?

Répondre

7

Vérifiez this ... A partir de la documentation - attention à la section sélectionnée:

les beforeSend, error, dataFilter, success et complete toutes les options prennent des fonctions de rappel qui sont invoquées au moment approprié. l'objet this pour tous sera l'objet dans lePropriététransmise à $.ajax dans les paramètres; Si cela n'a pas été spécifié, il s'agira d'une référence aux paramètres Ajax eux-mêmes.

Ainsi, dans le rappel error() (également success et complete, etc.), this sera l'objet passé à $.ajax() - sauf si vous utilisez le paramètre context pour le changer.

Comme une note, le data param passé dans $.ajax() seront convertis en une chaîne sérialisée pour une requête GET ou POST

L'autre option, est de faire juste que votre rappel error() a accès à la variable dans la même portée:

(function() { 
    // create a scope for us to store the data: 
    var data = {id: 1}; 
    $.ajax({ 
     url: '/something-to-genereate-error', 
     data: data, 
     error: function() { 
     console.log(this, data); 
     } 
    }); 
})(); // call the function immediatey 

See this fiddle for an example - Notez que le data intérieur de this est "id=1" wereas la data nous avons tenu une copie est encore {id:1}

également - Notez que la fermeture ici ((function() { .... })()) est à peu près inutile, il montre juste un moyen de stocker la variable data avant de passer dans $.ajax() et l'utiliser dans le rappel. Très probablement, cet appel ajax se trouve déjà dans une fonction où vous pourriez le faire.

+0

C'est génial, merci! –

+0

Est-ce que cela fonctionne seulement quand vous appelez .ajax() directement? Je ne peux pas le faire fonctionner mais j'utilise .getJSON() – hippietrail

0

Ok, je pense que je l'ai trouvé (basé sur ma réponse précédente et celle de Gnarf,

$.ajax({ 
    type: "POST", 
    url: "not-found",   
    context: {id: 123, name: "hello world"},   
    error: function(){ 
     console.debug($(this)); //only works in chrome      
    } 
}); 
+0

Merci! Quelle propriété de XHR contient les paramètres de requête? –

+0

Intéressant.Il semble que personne ne le fait, vous pouvez cependant essayer d'ajouter un en-tête en utilisant ces événements http://docs.jquery.com/Ajax_Events –

+0

-1 pour éditer votre réponse pour dupliquer efficacement la mienne ... Seule votre réponse ne fournit aucune explication sur la façon de obtenir effectivement l'information demandée par le PO. – gnarf

Questions connexes