2014-10-23 15 views
8

In breve, mi piacerebbe avere un callback generale che si attiva sempre in caso di una chiamata ajax di successo, seguita da una funzionalità di callback separata a seconda di dove viene invocato il metodo.Concatenamento di più callback richiamati alla stessa promessa differita

Questo sembra funzionare. La mia domanda è se questo è un uso corretto dell'oggetto promessa e se è sicuro assumere che più callback di promessa dello stesso tipo si impilano sempre in sequenza?

var dfd = $.Deferred(), 
    promise = dfd.promise(); 

promise.done(function(){ 
    console.log(1); 
}).done(function(){ 
    console.log(2); 
}); 

dfd.resolve(); 

http://jsfiddle.net/4ax4nxbh/

risposta

12

Si tratta di un uso corretto e documentato dell'oggetto differito in jQuery. La documentazione clearly states:

Le richiamate vengono eseguite nell'ordine in cui sono state aggiunte.

Esso funziona in modo diverso in altre biblioteche promessa e, in generale .then si preferisce .done comunque (spiegato più avanti nella risposta). Comunque dato che stai usando jQuery promette che si impilerà in modo sequenziale se sincronizzato.

Quindi la risposta diretta alla tua domanda è sì.

Tuttavia, è anche possibile fare questo con il codice asincrono e farlo catena meglio con .then:

promise.then(function(){ 
    console.log(1); 
}).then(function(){ 
    console.log(2); 
}).then(function(){ 
    return $.get(...); 
}).then(function(){ 
    console.log(3); // this always executes after the $.get finishes. 
}); 

In sostanza, done aggiunge un gestore e restituisce la stessa promessa e .then restituisce una nuova promessa incatenato da l'ultimo. In generale, userei solo .done per terminare le catene e se si desidera mantenere il valore di ritorno (l'argomento dello function(){)

+0

speravo che avresti trovato questo argomento;) Quando dici "generalmente. comunque. "Suppongo che tu ti riferisca al concatenamento, e non" fatto "rispetto a" allora "in generale? Immagino che l'approccio più adatto basato sul tuo commento sarebbe quello di usare 'then()' seguito da un "terminating" 'done()', anche se in questo caso sto trattando solo il codice sincrono? – Johan

+0

@Johan in generale Preferisco 'then' a' done' quando si utilizzano nuove librerie di promesse. In jQuery d'altra parte usare '.done' per terminare la catena è vantaggioso - quindi sì, quindi di nuovo non è il problema più grande con le promesse di jQuery. –

+1

concordato. Grazie per avermi imparato la differenza tra i due! – Johan

Problemi correlati