una sincronas promesas promesa hacer funciones ejemplos como javascript jquery deferred

sincronas - promesas javascript



¿Cuál es la diferencia entre un objeto diferido y su propio objeto de promesa? (3)

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

Vamos a crear un simple objeto diferido:

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

El objeto diferido anterior estará en el estado "pendiente" durante 3 segundos y luego cambiará al estado "resuelto" (en cuyo punto se invocarán todas las devoluciones de llamada vinculadas a él).

Recuperemos también la promesa de ese objeto diferido:

promise = defer.promise();

Ahora, para agregar devoluciones de llamada que se invocarán una vez que se resuelva el objeto .done() , podemos usar .done() o .then() . Sin embargo, podemos invocar este método tanto en el propio objeto aplazado como en su propio objeto de promesa.

defer.then( handler );

o

promise.then( handler );

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

Si usamos $.when , podemos pasar nuevamente el objeto Deferred o su objeto de promesa:

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

o

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

De nuevo, no hay diferencia entre las dos líneas de código anteriores.

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

Entonces, mi pregunta es porque podemos invocar .then() , .done() , etc. en el objeto Diferido en sí mismo y ya que podemos pasar ese objeto Diferido a $.when() , cuál es el punto de .promise() y recuperando el objeto de la promesa? ¿Cuál es el propósito del objeto promesa? ¿Por qué existe esta redundancia en la funcionalidad?


Con Aplazado, puede controlar su estado set .

Cuando se trata de la promesa, puede leer el estado y tal vez adjuntar devolución de llamada. get


Crea una copia "sellada" del valor diferido, sin los .resolve() y .reject() . De la documentación :

El método deferred.promise() permite que una función asíncrona evite que otro código interfiera 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 AJAX, devuelve un objeto de promesa. Internamente es .resolve() un valor para el objeto Deferred original, que el usuario observa con la promesa.