jQuery: l'oggetto Deferred

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.

Torna su