2011-11-10 12 views
27

Vamos a crear un simple objeto diferida:¿Cuál es la diferencia entre un objeto diferido y su propio objeto promesa?

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

El objeto diferido anteriormente estará en el estado "pendiente" durante 3 segundos, y luego cambiar al estado "resuelto" (momento en el que todas las devoluciones de llamada con destino a será invocado).

También vamos a recuperar la promesa de ese objeto diferido:

promise = defer.promise(); 

Ahora, para añadir devoluciones de llamada que van a ser invocada una vez que se resuelva el objeto diferido, podemos utilizar o .done().then(). Sin embargo, podemos invocar este método ambos en el objeto Diferido mismo o en su propio objeto promesa.

defer.then(handler); 

o

promise.then(handler); 

En ambos casos, se invoca la función handler (después de 3 segundos en este caso).

Si utilizamos $.when, podemos volver a pasar el objeto diferido sí o de su objeto promesa:

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

o

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

Una vez más, no hay ninguna diferencia entre los anteriores dos líneas de código .

Demostración en directo:http://jsfiddle.net/G6Ad6/

lo tanto, mi pregunta es, ya que podemos invocar .then(), .done(), etc., sobre el propio objeto diferido y ya que podemos pasar ese objeto diferido en $.when(), ¿cuál es el punto de .promise() y recuperar el objeto prometido? ¿Cuál es el propósito del objeto prometido? ¿Por qué hay esta redundancia en la funcionalidad?

Respuesta

23

Crea una copia "sellada" del valor diferido, sin los métodos .resolve() y .reject(). De the documentation:

deferred.promise() El método permite una función asíncrona para evitar otro código de interferir con el progreso o el estado de su solicitud interna.

Se usa cuando no tiene sentido que se modifique el valor. Por ejemplo, cuando jQuery realiza una solicitud de AJAX, devuelve un objeto de promesa. Internamente es .resolve() s un valor para el objeto original Deferred, que el usuario observa con la promesa.

+1

Ah, es una copia sellada * duh * ... eso lo explica. –

+1

Para agregar a esto que me lo dejó mucho más claro, desde [docs] (http://api.jquery.com/Types/#Promise): "Objeto Promesa: este objeto proporciona un subconjunto de los métodos del Objeto diferido (luego, hecho, error, siempre, canalización y estado) para evitar que los usuarios cambien el estado de Diferido. " –

2

Al usar la "promesa" de un objeto diferido los observadores (objetos que esperan resolver por ejemplo) no tienen acceso directo al objeto diferido, por lo que no pueden llamar, por ejemplo, el método "Resolver" de eso diferido. Es una forma de proteger el diferido original.

0

Con Deferido, puede controlar su estado set.

Cuando se trata de Promesa, puede leer el estado y quizás adjuntar la devolución de llamada. get

Cuestiones relacionadas