¿Cuál es la diferencia entre Deferred y Promise que no sean las versiones de jQuery?
¿Qué debo usar para mi necesidad? Solo quiero llamar al fooExecute()
. Solo necesito fooStart()
y fooEnd()
para alternar el estado div html, por ejemplo.
//I'm using jQuery v2.0.0
function fooStart() { /* Start Notification */ }
function fooEnd() { /* End Notification */ }
function fooExecute() { /* Execute the scripts */ }
$('#button1').on('click', function() {
var deferred1 = $.Deferred();
var promise1 = $.Promise();
deferred1.???
promise1.???
});
jquery
jquery-deferred
promise
fletchsod
fuente
fuente
resolve
D oreject
ed cambiar su estado, que también reflejará su promesa. Dígame, ¿cómo desea utilizar los diferidos para los clics?Respuestas:
Primero: no se puede usar
$.Promise();
porque no existe.Un objeto diferido es un objeto que puede crear una promesa y cambiar su estado a
resolved
orejected
. Los diferidos se utilizan normalmente si escribe su propia función y desea proporcionar una promesa al código de llamada. Eres el productor del valor.Una promesa es, como su nombre lo indica, una promesa de valor futuro. Puede adjuntar devoluciones de llamada para obtener ese valor. La promesa le fue "dada" y usted es el receptor del valor futuro.
No puede modificar el estado de la promesa. Solo el código que creó la promesa puede cambiar su estado.
Ejemplos:
1. ( producir ) Utiliza objetos diferidos cuando desea proporcionar soporte de promesa para sus propias funciones. Calcula un valor y desea controlar cuándo se resuelve la promesa.
function callMe() { var d = new $.Deferred(); setTimeout(function() { d.resolve('some_value_compute_asynchronously'); }, 1000); return d.promise(); } callMe().done(function(value) { alert(value); });
2. ( adelante ) Si está llamando a una función que en sí misma devuelve una promesa, entonces no tiene que crear su propio objeto diferido. Puedes devolver esa promesa. En este caso, la función no crea valor, sino que lo reenvía (más o menos):
function fetchData() { // do some configuration here and pass to `$.ajax` return $.ajax({...}); } fetchData().done(function(response) { // ... });
3. ( recibir ) A veces no quieres crear o transmitir promesas / valores, quieres usarlos directamente, es decir, eres el receptor de cierta información:
$('#my_element').fadeOut().promise().done(function() { // called when animation is finished });
Por supuesto, todos estos casos de uso también se pueden mezclar. Su función puede ser el receptor de valor (de una llamada Ajax, por ejemplo) y calcular (producir) un valor diferente basado en eso.
Preguntas relacionadas:
fuente
Una promesa es algo que puede establecer en un objeto diferido que se ejecuta cuando se completa la recopilación diferida.
Ejemplo de la documentación de jQuery :
<!DOCTYPE html> <html> <head> <style> div { height: 50px; width: 50px; float: left; margin-right: 10px; display: none; background-color: #090; } </style> <script src="http://code.jquery.com/jquery-1.9.1.js"></script> </head> <body> <button>Go</button> <p>Ready...</p> <div></div> <div></div> <div></div> <div></div> <script> $("button").on( "click", function() { $("p").append( "Started..."); $("div").each(function( i ) { $( this ).fadeIn().fadeOut( 1000 * (i+1) ); }); $( "div" ).promise().done(function() { $( "p" ).append( " Finished! " ); }); }); </script> </body> </html>
Aquí está en JSFiddle
Esto ejecuta una función en cada uno
div
y ejecuta el.promise
código cuando.each
se completan todas las ejecuciones.fuente