2012-01-13 6 views
89

Qualcuno può aiutarmi?
Non riesco a capire la differenza tra success e .done() di $.ajax.

Se possibile, fornire esempi.

+0

dove hai letto di un metodo done() di $ .ajax()? AFAIK il metodo done è correlato all'oggetto $ .Deferred. Forse stai parlando di. Complete()? – fcalderan

+1

su http://api.jquery.com/jQuery.ajax/page –

+2

ok, è jQuery 1.8 :) Poiché $ .ajax restituisce una promessa da jQuery 1.5 questa è una semplice sostituzione per una questione di coerenza (utilizzando l'interfaccia di differita): done() ha luogo di successo(), fallisce() per error() e always() per complete() – fcalderan

risposta

8

In breve, disaccoppiare la funzione di callback di successo dalla funzione Ajax in modo da poter aggiungere i propri gestori senza modificare il codice originale (modello osservatore).

Si prega di trovare informazioni più dettagliate da qui: https://stackoverflow.com/a/14754681/1049184

+1

E sotto di esso l'esempio mappa l'equivalenza di done => success, fail => error e sempre => complete – StuartLC

+23

Questa risposta non raggiunge il punto. C'è una differenza tra 'successo:' usato come parametro e '.success()' come metodo su un 'jqXHR'. Quest'ultimo viene deprecato, ma il primo è ciò che l'OP chiedeva. – Alnitak

+1

Success/error/complete sono deprecati e basati sulle modifiche allo stato di AJAX; done/fail/always sono basati su jQuery modifiche allo stato differite. Vedi http://api.jquery.com/category/deferred-object/. – mickeyreiss

90

success si attiva solo se la chiamata AJAX ha esito positivo, ovvero restituisce in definitiva uno stato HTTP 200. error si attiva se non riesce e complete al termine della richiesta, indipendentemente dal successo.

In jQuery 1.8 sull'oggetto jqXHR (restituito da $.ajax) success è stato sostituito con done, error con fail e complete con always.

Tuttavia, si dovrebbe comunque essere in grado di inizializzare la richiesta AJAX con la vecchia sintassi. Quindi, queste fanno cose simili:

// set success action before making the request 
$.ajax({ 
    url: '...', 
    success: function(){ 
    alert('AJAX successful'); 
    } 
}); 

// set success action just after starting the request 
var jqxhr = $.ajax("...") 
    .done(function() { alert("success"); }); 

Questo cambiamento è per la compatibilità con jQuery 1.5 di deferred object. Differite (e ora Promise, che ha il pieno supporto del browser nativo in Chrome e FX) si consente di catena di azioni asincrone:

$.ajax("parent"). 
    done(function(p) { return $.ajax("child/" + p.id); }). 
    done(someOtherDeferredFunction). 
    done(function(c) { alert("success: " + c.name); }); 

Questa catena di funzioni è più facile da gestire rispetto una piramide nidificato di callback che si ottiene con success.

Tuttavia, si ricorda che done è ora abbandonata in favore della sintassi Promise che utilizza then invece:

$.ajax("parent"). 
    then(function(p) { return $.ajax("child/" + p.id); }). 
    then(someOtherDeferredFunction). 
    then(function(c) { alert("success: " + c.name); }). 
    catch(function(err) { alert("error: " + err.message); }); 

Questa è la pena adottare perché async e await estendono promesse migliorato di sintassi (e di gestione degli errori):

+0

creazione della funzione prima di effettuare la richiesta e impostazione della funzione dopo aver effettuato la richiesta. Sembra che entrambi siano uguali ... mi farai vedere alcune differenze ??? – suhailvs

+0

@suhail: non ce ne sono davvero; in jQuery 1.6 c'era 'successo', in jQuery 1.8 che è stato sostituito da' done'. Funzionano allo stesso modo, ma 'done' è più coerente con il resto di jQuery. – Keith

0

success è il callback che viene richiamato quando la richiesta è riuscita e fa parte della chiamata $.ajax. done fa effettivamente parte dell'oggetto jqXHR restituito da $.ajax() e sostituisce success in jQuery 1.8.

5

.success() viene chiamato solo se il server Web risponde con un'intestazione HTTP 200 OK, in pratica quando tutto va bene.

I callback allegati a done() verranno attivati ​​quando viene risolto il differimento. I callback allegati a fail() verranno attivati ​​quando il differimento viene rifiutato.

promise.done(doneCallback).fail(failCallback) 

.done() has only one callback and it is the success callback 
+2

Vale la pena notare che .success() NON viene chiamato quando JSON non valido viene rinviato con un codice di stato 200/OK. In particolare, ho riscontrato un problema con il codice back-end del server Web che generava i valori NaN e li serializzava come javascript NaN (cioè come simbolo, non stringa 'NaN') che in realtà non è valido JSON, quindi l'analisi della risposta come JSON fallisce e .fail() viene eseguito, ma lo stato della risposta è 200. Ma è ancora vero che SOLO il successo viene chiamato con un codice di stato OK; volevo solo sottolineare che solo perché è OK, non significa che sia "successo";) – Kasapo

Problemi correlati