Odroczone a obiecane

83

Jaka jest różnica między Deferred i Promise innymi niż wersje jQuery?

Czego powinienem użyć do moich potrzeb? Chcę tylko zadzwonić do fooExecute(). Potrzebuję tylko fooStart()i, fooEnd()na przykład, do przełączania statusu div HTML.

//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
źródło
2
Nie możesz zmienić stanu obietnicy. W ten sposób jest obsługiwany do logiki żądającej (która może nie mieć żadnego interesu w manipulowaniu logiką warunków - do rozwiązania lub odrzucenia) - w oczekiwaniu na rozwiązanie - z logiki fabrycznej, która faktycznie ją stworzyła. Odroczony można resolved lub rejected zmienia swój stan, który będzie również odzwierciedlać jego obietnica. Powiedz mi, jak chcesz używać odroczonych płatności do kliknięć?
Andrevinsky
Nie sądzę, żeby twój przykład przyniósł korzyści z obietnic (albo nie rozumiem tego). Może spójrz na Jak można używać jQuery deferred? .
Felix Kling

Odpowiedzi:

131

Po pierwsze: nie możesz użyć, $.Promise();ponieważ nie istnieje.

Obiekt odroczony to obiekt, który może utworzyć obietnicę i zmienić jej stan na resolvedlub rejected. Odroczenia są zwykle używane, jeśli piszesz własną funkcję i chcesz zapewnić obietnicę dla kodu wywołującego. Jesteś wytwórcą wartości.

Obietnica jest, jak sama nazwa mówi, to obietnica o wartości przyszłej. Możesz dołączyć do niego wywołania zwrotne, aby uzyskać tę wartość. Obietnica została „dana” tobie i jesteś odbiorcą przyszłej wartości.
Nie możesz zmienić stanu obietnicy. Tylko kod, który utworzył obietnicę, może zmienić jej stan.

Przykłady:

1. ( produkuj ) Używasz odroczonych obiektów, gdy chcesz zapewnić obsługę obietnicy dla własnych funkcji. Obliczasz wartość i chcesz kontrolować, kiedy obietnica zostanie rozwiązana.

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. ( naprzód ) Jeśli wywołujesz funkcję, która sama zwraca obietnicę, nie musisz tworzyć własnego odroczonego obiektu. Możesz po prostu zwrócić tę obietnicę. W tym przypadku funkcja nie tworzy wartości, ale przekazuje ją dalej (rodzaj):

function fetchData() {
    // do some configuration here and pass to `$.ajax`
    return $.ajax({...});
}

fetchData().done(function(response) {
    // ...
});

3. ( odbierz ) Czasami nie chcesz tworzyć lub przekazywać obietnic / wartości, chcesz je bezpośrednio wykorzystać, tj. Jesteś odbiorcą pewnych informacji:

$('#my_element').fadeOut().promise().done(function() {
    // called when animation is finished
});

Oczywiście wszystkie te przypadki użycia można również mieszać. Twoja funkcja może być odbiornikiem wartości (na przykład z wywołania Ajax) i na tej podstawie obliczać (generować) inną wartość.


Powiązane pytania:

Felix Kling
źródło
2

Obietnica to coś, co można ustawić w odroczonym obiekcie, który jest wykonywany po zakończeniu odroczonej kolekcji.

Przykład z dokumentacji 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>

Tutaj jest w JSFiddle

To uruchamia funkcję na każdym divi wykonuje .promisekod po .eachzakończeniu wszystkich wykonań.

Codeman
źródło