2012-06-01 10 views
12

Ho una promessa $.ajax e voglio verificare se la mia risposta (sintatticamente valida) contiene un errore, attivando in questo caso lo stato rifiutato.Lancio di un errore nell'oggetto differito di jQuery

Ho lavorato con la mia libreria di promessa che tratta facilmente tali compiti. Non mi piace l'implementazione Promise (cache) di jQuery con il suo Deferred object e potrebbe aver trascurato qualcosa, perché raramente la uso. Credo che la strada da percorrere è solo utilizzando .then(), che sembra essere piuttosto complicata:

return $.ajax(...).then(function success(response) { 
    var problem = hasError(response); 
    if (problem) { 
     var error = new $.Deferred; 
     error.reject(problem); 
     return error; 
    } else 
     return response; 
}); 

Ciò dovrebbe restituire una promessa che viene rifiutata in caso di errori di rete o problemi con la risposta. Ma la restituzione di un rinvio rifiutato è davvero la [solo | migliore | più corta] strada da percorrere?

Avrei anche appriciato l'aiuto su come gestire tali "gestori di risposta di errore" nelle opzioni ajax, non sono riuscito a trovare una buona documentazione su di essi.


Disclaimer: No, non posso modificare le risposte del server. Il metodo di rilevamento dei problemi è sincrono. Non voglio usare altre librerie, sono particolarmente interessato al modo in cui jQuery risolve questo problema.

+0

OK, con '.then()' Volevo dire la cosa che '.pipe()' fa in jQuery :-( – Bergi

+0

a partire da Jquery 1.8 pipe === then – Plynx

+0

Sì, per fortuna hanno ottenuto almeno quello corretto – Bergi

risposta

31

ora aggiornato per jQuery 1.8+

Il modo più semplice per affrontare questo è quello di eseguire la risposta del $.ajax attraverso .then per filtrare in base successo o il fallimento dei dati.

$.ajax() 
    .then(function (response) { 
     return $.Deferred(function (deferred) { 
      var problem = hasError(response); 

      if (problem) { 
       return deferred.reject(problem) 
      } 

      deferred.resolve(response); 
     }).promise(); 
    }); 

si potrebbe quindi tornare questa nuova promessa di qualunque codice chiamante potrebbe consumare questo:

var request = function() { 
    return $.ajax() 
     .then(function (response) { 
      return $.Deferred(function (deferred) { 
       var problem = hasError(response); 

       if (problem) { 
        return deferred.reject(problem) 
       } 

       deferred.resolve(response); 
      }).promise(); 
     }); 
}; 

request() 
    .done(function (response) { 
     // handle success 
    }) 
    .fail(function (problem) { 
     // handle failure 
    }); 
+0

Qual è la differenza tra pipe e poi? – Bergi

+1

'pipe' consente di filtrare i valori differiti prima che vengano inviati a tutti i gestori di promesse registrati. 'then' è in realtà solo usato per registrare i gestori quando una promessa si risolve o rifiuta. – Eli

+1

No, [per specifica] (http://webcache.googleusercontent.com/search?q=cache%3awiki.commonjs.org/wiki/Promises/A) .then() farebbe esattamente questo. Oppure jQuery ha gettato questo e scambiato i nomi dei metodi? – Bergi

Problemi correlati