Diferido versus promesa

82

¿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.???
});
fletchsod
fuente
2
No puede cambiar el estado de la promesa. Por lo tanto, se maneja según la lógica solicitante (que podría no tener ningún interés en alterar la lógica de las condiciones, para resolver o rechazar), para esperar la resolución, desde la lógica de fábrica que realmente creó ese aplazamiento. Diferidos, pueda ser resolveD o rejected cambiar su estado, que también reflejará su promesa. Dígame, ¿cómo desea utilizar los diferidos para los clics?
Andrevinsky
No creo que su ejemplo pueda beneficiarse de las promesas (o no lo entiendo). Tal vez eche un vistazo a ¿Cómo se puede usar jQuery diferido? .
Felix Kling

Respuestas:

131

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 resolvedo rejected. 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:

Felix Kling
fuente
2

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 divy ejecuta el .promisecódigo cuando .eachse completan todas las ejecuciones.

Codeman
fuente