qual è la differenza tra il metodo success e .done () di $ .ajax


102

Qualcuno può aiutarmi?
Non sono in grado di capire la differenza tra successe .done()di $.ajax.

Se possibile, fornire esempi.


dove hai letto di un metodo done () di $ .ajax ()? Per quanto ne so, il metodo done è correlato all'oggetto $ .Deferred. Forse stai parlando di .complete () invece?
Fabrizio Calderan


2
ok, è jQuery 1.8 :) Dato che $ .ajax restituisce una promessa da jQuery 1.5 questa è una semplice sostituzione per una questione di coerenza (usando l'interfaccia di deferred): done () prende il posto di success (), fail () per errore () e sempre () per completare ()
Fabrizio Calderan

2
Il vero cambiamento è che puoi allegare più callback a livello di programmazione. Guarda la pagina della documentazione $ .Deferred.
Fabrizio Calderan

1
Possibile duplicato della gestione
BuZZ-dEE

Risposte:


8

In breve, separare la funzione di callback di successo dalla funzione ajax in modo da poter aggiungere in seguito i propri gestori senza modificare il codice originale (modello di 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 fatto => successo, fallimento => errore e sempre => completo
StuartLC

25
Questa risposta non coglie il punto. C'è una differenza tra success: usato come parametro e .success()come metodo su un file jqXHR. Quest'ultimo è stato deprecato, ma il primo è ciò che chiedeva il PO.
Alnitak

2
Il successo / errore / completamento sono deprecati e basati sui cambiamenti di stato di AJAX; fatto / fallito / sempre si basano sulle modifiche di stato differite di jQuery. Vedi api.jquery.com/category/deferred-object .
mickeyreiss

28
Non riesco a credere a una risposta che interpreta male la domanda è sia la soluzione più votata che accettata ...
Trascendenza

108

successsi attiva solo se la chiamata AJAX ha esito positivo, ovvero alla fine restituisce uno stato HTTP 200. errorsi attiva se fallisce e completequando la richiesta termina, indipendentemente dal successo.

In jQuery 1.8 l' jqXHRoggetto (restituito da $.ajax) è successstato sostituito con done, errorcon faile completecon always.

Tuttavia dovresti ancora essere in grado di inizializzare la richiesta AJAX con la vecchia sintassi. Quindi questi 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"); });

Questa modifica è per compatibilità con l' oggetto differito di jQuery 1.5 . Differito (e ora Promise, che ha il supporto completo del browser nativo in Chrome e FX) ti consente di concatenare 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 mantenere rispetto a una piramide annidata di callback con cui si ottiene success.

Tuttavia, tieni presente che doneora è deprecato a favore della Promisesintassi che utilizza theninvece:

$.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); });

Vale la pena adottarlo perché asynced awaitextended promette una sintassi migliorata (e la gestione degli errori):

try {
    var p = await $.ajax("parent");
    var x = await $.ajax("child/" + p.id);
    var c = await someOtherDeferredFunction(x);
    alert("success: " + c.name);
}
catch(err) { 
    alert("error: " + err.message); 
}

creazione della funzione prima di effettuare la richiesta e impostare la funzione dopo aver effettuato la richiesta. Sembra che entrambi siano uguali ... mi mostrerai altre differenze ???
suhailvs

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

@ Keith quindi oggi, usare .done equivale a usare il successo? o c'è qualcos'altro ancora più nuovo?
Roxy'Pro

@ Roxy'Pro questo era obsoleto quando ho risposto, di certo non lo userei nel 2018. è .donestato il primo (e ora vicolo cieco) di jQuery a quello che è diventato Promisee che ora ha un supporto linguistico abbastanza completo. In nuovi progetti userei const response = await fetch(...)invece.
Keith

6

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

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

promise.done(doneCallback).fail(failCallback)

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

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

1

successè il callback che viene richiamato quando la richiesta ha esito positivo e fa parte della $.ajaxchiamata. doneè effettivamente parte jqXHRdell'oggetto restituito da $.ajax()e sostituisce successin jQuery 1.8.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.