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.