jQuery 1,5 przynosi nowe odroczony przedmiot i dołączone metody .when
, .Deferred
i ._Deferred
.
Dla tych, którzy nie używali .Deferred
wcześniej, mam uwagami na źródło dla niego .
Jakie są możliwe zastosowania tych nowych metod, w jaki sposób zajmiemy się dopasowaniem ich do wzorców?
Przeczytałem już interfejs API i źródło , więc wiem, co robi. Moje pytanie brzmi: w jaki sposób możemy korzystać z tych nowych funkcji w codziennym kodzie?
Mam prosty przykład klasy bufora, która po kolei wywołuje żądanie AJAX. (Następny zaczyna się po zakończeniu poprzedniego).
/* Class: Buffer
* methods: append
*
* Constructor: takes a function which will be the task handler to be called
*
* .append appends a task to the buffer. Buffer will only call a task when the
* previous task has finished
*/
var Buffer = function(handler) {
var tasks = [];
// empty resolved deferred object
var deferred = $.when();
// handle the next object
function handleNextTask() {
// if the current deferred task has resolved and there are more tasks
if (deferred.isResolved() && tasks.length > 0) {
// grab a task
var task = tasks.shift();
// set the deferred to be deferred returned from the handler
deferred = handler(task);
// if its not a deferred object then set it to be an empty deferred object
if (!(deferred && deferred.promise)) {
deferred = $.when();
}
// if we have tasks left then handle the next one when the current one
// is done.
if (tasks.length > 0) {
deferred.done(handleNextTask);
}
}
}
// appends a task.
this.append = function(task) {
// add to the array
tasks.push(task);
// handle the next task
handleNextTask();
};
};
Szukam demonstracji i możliwych zastosowań .Deferred
i .when
.
Byłoby również miło zobaczyć przykłady ._Deferred
.
Powiązanie z nowym jQuery.ajax
źródłem przykładów to oszustwo.
Szczególnie interesuje mnie, jakie techniki są dostępne, gdy wyodrębniamy, czy operacja jest wykonywana synchronicznie, czy asynchronicznie.
źródło
._Deferred
jest po prostu prawdziwym „Odroczonym obiektem”, który.Deferred
wykorzystuje. To wewnętrzny obiekt, którego najprawdopodobniej nigdy nie będziesz potrzebować.Odpowiedzi:
Najlepszy przypadek użycia, jaki mogę wymyślić, to buforowanie odpowiedzi AJAX. Oto zmodyfikowany przykład z postu wprowadzającego Rebecca Murphey na ten temat :
Zasadniczo, jeśli wartość została już raz zażądana, zanim zostanie natychmiast zwrócona z pamięci podręcznej. W przeciwnym razie żądanie AJAX pobiera dane i dodaje je do pamięci podręcznej.
$.when
/.then
Nie dba o nic z tego; wszystko, o co musisz się martwić, to skorzystanie z odpowiedzi, która jest przekazywana do programu.then()
obsługi w obu przypadkach.jQuery.when()
obsługuje niezrealizowaną / odroczoną jako zakończoną, natychmiast wykonując dowolną.done()
lub.then()
w łańcuchu.Odroczenia są idealne na wypadek, gdy zadanie może działać asynchronicznie lub nie, a chcesz wyodrębnić ten warunek z kodu.
Kolejny przykład z użyciem
$.when
pomocnika:źródło
cache[ val ]
NIE zwróci obietnicy (dokumentacja jquery mówi, że parametr to dane zwrócone przez nadawcę), co oznacza, że dostęp członka.then
będzie błąd ... prawda? czego mi brakuje?Oto nieco inna implementacja pamięci podręcznej AJAX niż w odpowiedzi ehynd .
Jak zauważono w pytaniu uzupełniającym fortuneRice, implementacja ehynd nie zapobiegła wielu identycznym żądaniom, jeśli żądania zostały wykonane przed zwrotem jednego z nich. To jest,
najprawdopodobniej spowoduje 3 żądania AJAX, jeśli wynik dla „xxx” nie był wcześniej buforowany.
Można to rozwiązać, buforując odroczone żądanie zamiast wyniku:
źródło
Odroczenie może być użyte zamiast muteksu. Jest to w zasadzie to samo co scenariusze użycia wielu aukcji.
MUTEX
ODROCZONY
Używając opcji Odroczony jako muteksu, uważaj na wpływ na wydajność (http://jsperf.com/deferred-vs-mutex/2). Chociaż wygoda, a także dodatkowe korzyści zapewniane przez Odroczone są tego warte, a faktyczne (oparte na zdarzeniach użytkownika) wykorzystanie wydajności nie powinno być zauważalne.
źródło
To jest autopromocyjna odpowiedź, ale spędziłem kilka miesięcy badając ją i prezentując wyniki na konferencji jQuery w San Francisco 2012.
Oto bezpłatny film z rozmowy:
https://www.youtube.com/watch?v=juRtEEsHI9E
źródło
Kolejnym zastosowaniem, który wykorzystałem w dobrym celu, jest pobieranie danych z wielu źródeł. W poniższym przykładzie pobieram wiele niezależnych obiektów schematu JSON używanych w istniejącej aplikacji do sprawdzania poprawności między klientem a serwerem REST. W tym przypadku nie chcę, aby aplikacja po stronie przeglądarki rozpoczynała ładowanie danych, zanim załadowane zostaną wszystkie schematy. $ .when.apply (). then () jest do tego idealny. Dziękujemy Raynosowi za wskazówki dotyczące używania wtedy (fn1, fn2) do monitorowania warunków błędów.
źródło
Kolejny przykład użycia
Deferred
s do zaimplementowania pamięci podręcznej dla dowolnego rodzaju obliczeń (zwykle niektóre zadania wymagające dużej wydajności lub długotrwałe):Oto przykład użycia tej klasy do wykonania niektórych (symulowanych ciężkich) obliczeń:
Tej samej pamięci podręcznej można użyć do buforowania żądań Ajax:
Możesz grać z powyższym kodem w tym jsFiddle .
źródło
1) Użyj go, aby zapewnić uporządkowane wykonanie oddzwaniania:
2) Użyj go, aby zweryfikować status aplikacji:
źródło
Możesz użyć odroczonego obiektu, aby stworzyć płynny projekt, który działa dobrze w przeglądarkach webkit. Przeglądarki Webkit będą uruchamiać zdarzenie zmiany rozmiaru dla każdego piksela, którego rozmiar jest zmieniany, w przeciwieństwie do FF i IE, które uruchamiają zdarzenie tylko raz dla każdej zmiany rozmiaru. W rezultacie nie masz kontroli nad kolejnością wykonywania funkcji związanych ze zdarzeniem zmiany rozmiaru okna. Coś takiego rozwiązuje problem:
Spowoduje to serializację wykonania kodu, tak aby działał zgodnie z przeznaczeniem. Uważaj na pułapki przy przekazywaniu metod obiektowych jako oddzwaniania do odroczonego. Gdy taka metoda zostanie wykonana jako wywołanie zwrotne do odroczenia, odniesienie „to” zostanie zastąpione odniesieniem do odroczonego obiektu i nie będzie już odnosiło się do obiektu, do którego należy metoda.
źródło
resizeQueue.done(resizeAlgorithm)
jest dokładnie tak samo jakresizeAlgorithm
. To kompletne oszustwo!.done
.Możesz także zintegrować go z dowolnymi bibliotekami innych firm korzystającymi z JQuery.
Jedną z takich bibliotek jest Backbone, która w rzeczywistości będzie obsługiwać Odroczoną w ich następnej wersji.
źródło
read more here
zamiaston my blog
. Jest to lepsza praktyka i może uchronić Cię przed (przypadkowym) spamowaniem. :)Właśnie użyłem opcji Odroczony w prawdziwym kodzie. W projekcie jQuery Terminal mam funkcję exec, która wywołuje polecenia zdefiniowane przez użytkownika (tak jak on wchodził do niej i naciskał enter), dodałem Deferreds do API i wywołuje exec z tablicami. lubię to:
lub
polecenia mogą uruchamiać kod asynchroniczny, a exec musi wywoływać kod użytkownika w kolejności. Mój pierwszy interfejs API wykorzystuje parę połączeń pauzujących / wznawiających, aw nowym interfejsie API wywołuję te automatycznie, gdy użytkownik zwróci obietnicę. Więc kod użytkownika może po prostu użyć
lub
Używam takiego kodu:
dalyed_commands jest używany w funkcji wznawiania, która ponownie wywołuje exec ze wszystkimi dalyed_commands.
i część funkcji poleceń (usunąłem niepowiązane części)
źródło
Odpowiedź ehynds nie będzie działać, ponieważ buforuje dane odpowiedzi. Powinien buforować jqXHR, który jest również obietnicą. Oto poprawny kod:
Odpowiedź Juliana D. będzie działać poprawnie i jest lepszym rozwiązaniem.
źródło