jQuery.Deferred()
, introdotto in jQuery 1.5, è un oggetto di utility che può registrare funzioni di callback multiple e memorizzarle in una coda, invocare una o più code, e gestire lo stato di successo o di fallimento di qualsiasi funzione sincrona o asincrona.
Come funziona l'oggetto Deferred
In JavaScript è prassi comune invocare funzioni che possono accettare dei callback invocati in quella funzione. Per esempio, nelle versioni di jQuery precedenti alla 1.5, i processi asincroni come jQuery.ajax()
accettano callback da invocare in caso che la richiesta AJAX abbia avuto successo o meno o sia stata completata.
jQuery.Deferred()
introduce diversi miglioramenti nel modo con cui i callback sono gestiti ed invocati. In particolare, jQuery.Deferred()
fornisce dei modi flessibili per creare callback multipli, e questi callback possono essere invocati a prescindere dal fatto che il callback originale ha già avuto luogo. Questo oggetto è basato sul design di CommonJS Promises / A.
Bisogna pensare a questo oggetto come una funzione wrapper che genera una catena. I metodi deferred.then(), deferred.done() e deferred.fail() specificano le funzioni da chiamare e
deferred.resolve(args) o deferred.reject(args) chiamano le funzioni con gli argomenti che voi gli fornite. Una volta che un oggetto Deferred
è stato risolto o rifiutato permane in quello stato; una seconda chiamata al metodo resolve()
viene quindi ignorata. Se più funzioni vengono aggiunte tramite il metodo then()
dopo che l'oggetto Deferred
è stato risolto, esse vengono eseguite immediatamente con gli argomenti forniti in precedenza.
Il costruttore jQuery.Deferred()
Questo costruttore crea un nuovo oggetto Deferred
(l'operatore new
è facoltativo). A questo oggetto può essere passata una funzione che viene eseguita prima della creazione dell'oggetto restituito dal costruttore. Questa funzione riceve come argomento l'oggetto Deferred
e l'oggetto this
. La funzione può usare diversi callback usando ad esempio il metodo then()
.
L'oggetto parte in uno stato di tipo unresolved (non risolto). Qualsiasi callback aggiunto con i metodi then()
, done()
o fail()
viene messo in coda per essere eseguito dopo.
Usare resolve()
o deferred.resolveWith() fanno passare l'oggetto alla stato di risolto e quindi le funzioni impostate tramite done()
vengono eseguite immediatamente. Chiamare invece reject()
o deferred.rejectWith() fanno passare l'oggetto allo stato di respinto (rejected) e quindi le funzioni impostate tramite fail()
vengono eseguite immediatamente. Una volta che l'oggetto è passato ad uno di questi stati, rimane in tale stato. Le funzioni di callback che vengono quindi aggiunte all'oggetto vengono eseguite subito.
I metodi di questo oggetto possono essere concatenati come qualsiasi altro oggetto di jQuery. Dopo la sua creazione, si possono usare i metodi elencati di seguito sia concatenandoli direttamente all'oggetto che salvando l'oggetto in una variabile e invocando i metodi su quella variabile.