2011-09-13 3 views
2

Supposons que j'ai une fonction fancyParse destinée à recevoir la réponse renvoyée par le serveur et à la transformer en autre chose. Cette fonction se déclenche si la réponse n'a aucun sens, ou si elle possède un drapeau spécial "erreur interne". Je voudrais enchaîner cette fonction dans un appel $.post pour obtenir un nouveau Deferred. Cette nouvelle différée échouerait si la requête échoue, ou si fancyParse se déclenche. Il réussira si la requête réussit et fancyParse réussit, et, surtout, passera le résultat de fancyParse à ses rappels réussis.Le moyen le plus simple de post-traiter le résultat d'une requête jQuery ajax?

La solution idéale ressemblerait à quelque chose comme ceci:

$.post('/url', etc).postprocess(fancyParse) 
    .done(my_done_handler) 
    .fail(my_fail_handler); 

Est-ce quelque chose comme ça déjà, ou dois-je écrire un moi-même postprocess?

Répondre

2

dataFilter Cette fonction peut être utilisée pour traiter des données. Vous le transmettez avec votre demande.

http://api.jquery.com/jQuery.ajax/

$.ajax({ 
    ..., 
    dataFilter: function (data, type) { 
     // do something with data and return it 
     return data.toLowerCase(); 
    } 
}) 
+0

La documentation ne précise pas, mais peut-être vous savez: faire des exceptions dans la fonction de filtre faire que la demande soit traitée comme ayant échoué? –

+0

Désolé, je ne sais pas. Mais pourquoi ne saisissez-vous pas les exceptions, puis appelez le gestionnaire d'erreurs depuis votre post-processeur? – jbasko

+0

Parce qu'il y a plus que d'appeler le gestionnaire d'erreur. J'ai aussi besoin que le 'Deferred' devienne * rejeté *, de sorte que tous les gestionnaires d'erreurs ajoutés après soient également invoqués. –

4

Vous pouvez créer votre propre objet différé:

$.postProcess = function(addr,test) { 
    var dfd = $.Deferred();   // create deferred object 
    $.post(addr)     // make ajax call 
    .success(function(response) { // if ajax is OK 
    if (test) {     // Your filter test 
     dfd.resolve("OK");   // if test is passed, call done() 
    } else { 
     dfd.reject("Bad test");  // otherwise call reject 
    } 
    }) 
    .error(function() {    // on ajax error 
    dfd.reject("Error");   // reject 
    }); 
    return dfd.promise();      // return deferred object 
}; 

//$.postProcess('/echo/json/',true) // to test good case 
//$.postProcess('/echo/json/',false) // to test bad test 
$.postProcess('/echo/error/',true) // to test bad ajax 
.done(function(msg){ 
    alert('ok:'+msg); 
}) 
.fail(function(msg){ 
    alert('fail:'+msg); 
}); 

http://jsfiddle.net/bouillard/FRsjV/

+0

Merci pour l'effort, j'ai +1 de plus. Je pense que je vais utiliser ceci pour quelque chose d'autre que j'ai en tête, mais pour le post-processus, le 'dataFilter' est parfait. –

+0

Oui, dans ce cas, le filtre de données doit être plus court que différé. Mais différé pourrait être un moyen très pratique pour une application. THX. –

Questions connexes