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.???
});


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:


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ń.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.