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.???
});
jquery
jquery-deferred
promise
fletchsod
źródło
źródło
resolve
d lubreject
ed 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ęć?Odpowiedzi:
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
resolved
lubrejected
. 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:
źródło
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
div
i wykonuje.promise
kod po.each
zakończeniu wszystkich wykonań.źródło