2011-11-10 20 views
27

Creiamo un semplice oggetto differita:Qual è la differenza tra un oggetto differito e il suo oggetto promessa?

defer = $.Deferred(function (defer) { 
    setTimeout(defer.resolve, 3000); 
}); 

L'oggetto differite sopra sarà nello stato "sospeso" per 3 secondi, e poi passare allo stato "risolto" (a questo punto tutti i richiami legati a sarà invocato).

Diamo anche recuperare la promessa di tale oggetto differita:

promise = defer.promise(); 

Ora, per aggiungere funzioni di callback, che stanno per essere invocato una volta che l'oggetto differite è stato risolto, possiamo usare .done() o .then(). Tuttavia, è possibile richiamare questo metodo sia sull'oggetto Differito stesso o sul proprio oggetto promessa.

defer.then(handler); 

o

promise.then(handler); 

In entrambi i casi, viene richiamata la funzione handler (dopo 3 secondi in questo caso).

Se usiamo $.when, possiamo ancora passare l'oggetto differita stesso o il suo oggetto promessa:

$.when(defer).then(handler); 

o

$.when(promise).then(handler); 

caso, non v'è alcuna differenza tra queste due linee di codice .

Demo online:http://jsfiddle.net/G6Ad6/

Quindi, la mia domanda è: dal momento che possiamo invocare .then(), .done(), ecc sull'oggetto differito stesso e dal momento che possiamo passare quell'oggetto differita in $.when(), qual è il punto di .promise() e recuperando l'oggetto promessa? Qual è lo scopo dell'oggetto promessa? Perché c'è questa ridondanza nella funzionalità?

risposta

23

Crea una copia "sigillata" del valore differito, senza i metodi .resolve() e .reject(). Da the documentation:

Procedimento deferred.promise() consente una funzione asincrona per evitare altro codice di interferire con l'avanzamento o lo stato della sua richiesta interna.

Viene utilizzato quando non ha senso che il valore sia modificato. Ad esempio, quando jQuery effettua una richiesta AJAX restituisce un oggetto promessa. Internamente è .resolve() s un valore per l'oggetto originale Deferred, che l'utente osserva con la promessa.

+1

Ah è una copia sigillata * duh * ... che lo spiega. –

+1

Per aggiungere a questo che mi ha reso molto più chiaro, da [docs] (http://api.jquery.com/Types/#Promise): "Promise Object - Questo oggetto fornisce un sottoinsieme dei metodi del Oggetto rinviato (quindi, fatto, non riuscito, sempre, pipe e stato) per impedire agli utenti di modificare lo stato del differito. " –

2

Quando si utilizza la "promessa" di un oggetto rinviato gli osservatori (oggetti in attesa di risoluzione per l'esempio) non hanno accesso diretto all'oggetto rinviato stesso, quindi non possono chiamare, ad esempio, il metodo "Risolvi" di quello rinviato. È un modo di proteggere l'originale rinviato.

0

Con Differito, è possibile controllare il suo stato set.

Quando si tratta della Promessa, è possibile leggere lo stato e magari allegare il callback. get

Problemi correlati