Łączenie i komponowanie obietnic
Proszę nauczyć się łączyć wiele operacji asynchronicznych za pomocą .then() i .pipe() oraz komponować złożone przepływy pracy, oczekując na zakończenie wielu obietnic przy użyciu $.when().
Łączenie i komponowanie obietnic to bezpłatna lekcja jQuery Academy na CoddyKit. To lekcja 2 z 3. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej jQuery Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs jQuery Academy zawiera 3 lekcji w sumie.
Sekwencyjne wykonywanie operacji asynchronicznych
W tworzeniu aplikacji internetowych często trzeba wykonywać zadania asynchroniczne (takie jak pobieranie danych) w określonej kolejności. Łączenie promise’ów pozwala robić to w przejrzysty sposób.
Zamiast zagnieżdżać callbacki, co może prowadzić do „piekła callbacków”, można łączyć operacje sekwencyjnie, dzięki czemu kod jest znacznie łatwiejszy do odczytania i utrzymania.
Łączenie za pomocą .then()
Metoda .then() jest podstawą łączenia operacji. Gdy obiekt Deferred (lub Promise) zostanie spełniony, wykonywany jest jego callback .then(). Wartość zwrócona przez ten callback może następnie zostać wykorzystana przez kolejny element .then() w łańcuchu.
Jeśli callback zwróci nowy obiekt Deferred, łańcuch zaczeka na jego spełnienie, zanim będzie kontynuowany.
Prosty przykład łańcucha .then()
Przyjrzyjmy się prostemu przykładowi, w którym symulujemy dwa kroki asynchroniczne. Drugi krok jest wykonywany dopiero po zakończeniu pierwszego i korzysta z danych uzyskanych w pierwszym kroku.
Proszę zauważyć, jak wynik step1 ('Data from Step 1') jest przekazywany do step2.
function runChainExample() {
let dfd1 = new $.Deferred();
let dfd2 = new $.Deferred();
setTimeout(() => {
console.log("Step 1 complete!");
dfd1.resolve("Data from Step 1");
}, 500);
dfd1.then(function(data1) {
console.log("Received in Step 2: " + data1);
setTimeout(() => {
console.log("Step 2 complete!");
dfd2.resolve("Processed " + data1);
}, 300);
return dfd2;
}).then(function(data2) {
console.log("Received in Final Step: " + data2);
console.log("Chain finished!");
});
}
$(document).ready(function() {
runChainExample();
});Przepływ danych w łańcuchach .then()
Wartość zwrócona przez callback .then() określa dane wejściowe dla następnego .then().
- Jeśli zostanie zwrócona wartość niebędąca obiektem Deferred, stanie się ona spełnioną wartością dla następnego
.then(). - Jeśli zostanie zwrócony obiekt Deferred, łańcuch wstrzyma działanie do czasu jego spełnienia, a spełniona wartość zostanie następnie przekazana do kolejnego
.then().
Używanie .pipe() do transformacji
Choć .then() jest obecnie standardem, jQuery's .Deferred() udostępnia również .pipe(). Działa ona podobnie do .then(), ale pierwotnie została zaprojektowana do przekształcania spełnionej lub odrzuconej wartości albo do filtrowania obiektu Deferred, który kontynuuje łańcuch.
.pipe() może służyć do zwracania nowego obiektu Deferred, który zostanie spełniony przekształconą wartością, skutecznie „przekazując” ją do następnego etapu.
Przykład transformacji za pomocą .pipe()
W tym przykładzie używamy .pipe(), aby pobrać wynik pierwszej operacji, przekształcić go (np. zamienić na wielkie litery), a następnie przekazać przekształconą wartość do końcowego handlera .done().
function runPipeExample() {
let dfd = new $.Deferred();
setTimeout(() => {
console.log("Initial data ready.");
dfd.resolve("hello world");
}, 500);
dfd.pipe(function(originalData) {
console.log("Piping: Transforming data...");
return originalData.toUpperCase(); // Transforms the value
}).done(function(transformedData) {
console.log("Final result: " + transformedData);
});
}
$(document).ready(function() {
runPipeExample();
});Komponowanie za pomocą $.when()
Co zrobić, gdy mają Państwo wiele niezależnych zadań asynchronicznych, ale przed przejściem dalej trzeba zaczekać na ukończenie wszystkich? Właśnie do tego służy $.when().
$.when() przyjmuje jako argumenty jeden lub więcej obiektów Deferred (albo Promise) i zwraca nowy obiekt Deferred. Ten nowy obiekt Deferred zostaje spełniony dopiero wtedy, gdy wszystkie przekazane obiekty Deferred zostaną spełnione.
Przykład zadań równoległych z $.when()
W tym przykładzie symulujemy dwa niezależne żądania AJAX (fetchUser i fetchPosts). Używamy $.when(), aby zaczekać na zakończenie obu żądań przed zapisaniem połączonych wyników w konsoli.
Proszę zauważyć, że są wykonywane równolegle, a nie sekwencyjnie.
function runWhenExample() {
function fetchUser() {
let dfd = new $.Deferred();
setTimeout(() => {
console.log("User data fetched.");
dfd.resolve({ id: 1, name: "Alice" });
}, 800);
return dfd.promise();
}
function fetchPosts() {
let dfd = new $.Deferred();
setTimeout(() => {
console.log("Posts data fetched.");
dfd.resolve([{ id: 101, title: "Post 1" }, { id: 102, title: "Post 2" }]);
}, 500);
return dfd.promise();
}
$.when(fetchUser(), fetchPosts())
.done(function(userData, postsData) {
console.log("All data loaded!");
console.log("User: ", userData);
console.log("Posts: ", postsData);
})
.fail(function() {
console.log("One or more tasks failed.");
});
}
$(document).ready(function() {
runWhenExample();
});Dostęp do wyników $.when()
Gdy obiekt Deferred zwrócony przez $.when() zostanie spełniony, jego callbacki .done() lub .then() otrzymują spełnione wartości z każdego wejściowego obiektu Deferred jako osobne argumenty, w kolejności, w jakiej obiekty te przekazano do $.when().
Ułatwia to łączenie i przetwarzanie danych z wielu źródeł, gdy wszystkie są już dostępne.
Quiz: łączenie promise’ów
Proszę rozważyć następujący fragment kodu jQuery:
let dfd1 = new $.Deferred();
let dfd2 = new $.Deferred();
dfd1.then(function(val) {
return val + " World";
}).then(function(newVal) {
console.log(newVal); // Line A
return dfd2;
}).then(function() {
console.log("Finished!"); // Line B
});
dfd1.resolve("Hello");
dfd2.resolve();JAKI BĘDZIE KOŃCOWY wynik wyświetlony w konsoli i w jakiej kolejności?
Podsumowanie: łączenie i komponowanie
Nauczyli się Państwo zarządzać złożonymi przepływami asynchronicznymi:
- Łączenie za pomocą
.then(): wykonuje operacje sekwencyjnie, przekazując wyniki z jednego etapu do następnego. .pipe(): starsza metoda przekształcania wartości lub mapowania obiektów Deferred w łańcuchu.- Komponowanie za pomocą
$.when(): czeka na równoległe zakończenie wielu niezależnych obiektów Deferred, a następnie udostępnia ich wyniki jako osobne argumenty.
Wzorce te mają kluczowe znaczenie przy tworzeniu niezawodnych i czytelnych aplikacji asynchronicznych.
Często zadawane pytania
Czy lekcja „Łączenie i komponowanie obietnic” jest bezpłatna?
Tak — pełny tekst „Łączenie i komponowanie obietnic” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu jQuery Academy, przejdź na CoddyKit PRO. Kurs jQuery Academy zawiera 3 lekcji w sumie.
Co nauczysz się w „Łączenie i komponowanie obietnic”?
Proszę nauczyć się łączyć wiele operacji asynchronicznych za pomocą .then() i .pipe() oraz komponować złożone przepływy pracy, oczekując na zakończenie wielu obietnic przy użyciu $.when(). Ćwiczysz jQuery Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć jQuery Academy?
Nie wymagamy żadnego doświadczenia. jQuery Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 3.
Ile czasu zajmuje lekcja „Łączenie i komponowanie obietnic”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji jQuery Academy?
Tak. Każda lekcja jQuery Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Poznawanie obiektów Deferred
- Łączenie i komponowanie obietnic
- Obsługa wielu zadań asynchronicznych