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?
Ah, es una copia sellada * duh * ... eso lo explica. –
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. " –