Promises verketten und kombinieren
Lernen Sie, mehrere asynchrone Vorgänge mit .then() und .pipe() zu verketten und komplexe Abläufe zu kombinieren, indem Sie mit $.when() auf den Abschluss mehrerer Promises warten.
Promises verketten und kombinieren ist eine kostenlose jQuery Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 3. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des jQuery Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der jQuery Academy-Kurs umfasst insgesamt 3 Lektionen.
Asynchrone Vorgänge sequenzieren
In der Webentwicklung müssen wir häufig asynchrone Aufgaben (z. B. das Abrufen von Daten) in einer bestimmten Reihenfolge ausführen. Mit dem Verketten von Promises können wir dies übersichtlich umsetzen.
Statt Callbacks zu verschachteln, was zu „Callback-Hell“ führen kann, verknüpfen wir die Vorgänge nacheinander. Dadurch wird unser Code wesentlich leichter lesbar und wartbar.
Verketten mit .then()
Die Methode .then() ist grundlegend für das Verketten. Wenn ein Deferred-Objekt (oder Promise) aufgelöst wird, wird sein .then()-Callback ausgeführt. Der Rückgabewert dieses Callbacks kann anschließend vom nächsten .then() in der Kette verwendet werden.
Gibt der Callback ein neues Deferred-Objekt zurück, wartet die Kette, bis dieses neue Deferred-Objekt aufgelöst wird, bevor sie fortgesetzt wird.
Einfaches Beispiel für eine .then()-Kette
Sehen wir uns ein einfaches Beispiel an, in dem wir zwei asynchrone Schritte simulieren. Der zweite Schritt wird erst ausgeführt, nachdem der erste abgeschlossen ist, und verwendet die Daten aus dem ersten Schritt.
Beachten Sie, wie das Ergebnis von step1 ('Data from Step 1') an step2 übergeben wird.
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();
});Datenfluss in .then()-Ketten
Der von einem .then()-Callback zurückgegebene Wert bestimmt die Eingabe für das nächste .then().
- Wenn Sie einen Wert zurückgeben, der kein Deferred-Objekt ist, wird dieser Wert zum aufgelösten Wert für das nächste
.then(). - Wenn Sie ein Deferred-Objekt zurückgeben, pausiert die Kette, bis dieses Deferred-Objekt aufgelöst wird. Sein aufgelöster Wert wird anschließend an das nächste
.then()übergeben.
Transformation mit .pipe()
Obwohl .then() heute der Standard ist, bietet jQuery's .Deferred() auch .pipe(). Die Methode ähnelt .then(), wurde ursprünglich jedoch dafür entwickelt, aufgelöste oder abgelehnte Werte zu transformieren oder festzulegen, welches Deferred-Objekt die Kette fortsetzt.
Mit .pipe() können Sie ein neues Deferred-Objekt zurückgeben, das mit einem transformierten Wert aufgelöst wird. Der Wert wird dadurch effektiv an die nächste Stufe „weitergeleitet“.
Beispiel für eine .pipe()-Transformation
Hier verwenden wir .pipe(), um das Ergebnis des ersten Vorgangs zu übernehmen, zu transformieren (z. B. in Großbuchstaben umzuwandeln) und anschließend den transformierten Wert an den abschließenden .done()-Handler zu übergeben.
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();
});Kombinieren mit $.when()
Was ist, wenn Sie mehrere asynchrone Aufgaben haben, die unabhängig voneinander sind, Sie aber warten müssen, bis alle abgeschlossen sind, bevor Sie fortfahren? Genau dafür gibt es $.when().
$.when() nimmt ein oder mehrere Deferred-Objekte (oder Promises) als Argumente entgegen und gibt ein neues Deferred-Objekt zurück. Dieses neue Deferred-Objekt wird erst aufgelöst, wenn alle übergebenen Deferred-Objekte aufgelöst wurden.
Beispiel für parallele Aufgaben mit $.when()
In diesem Beispiel simulieren wir zwei unabhängige AJAX-Anfragen (fetchUser und fetchPosts). Mit $.when() warten wir, bis beide abgeschlossen sind, bevor wir die zusammengeführten Ergebnisse protokollieren.
Beachten Sie, dass sie parallel und nicht nacheinander ausgeführt werden.
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();
});Auf die Ergebnisse von $.when() zugreifen
Wenn das von $.when() zurückgegebene Deferred-Objekt aufgelöst wird, erhalten seine .done()- oder .then()-Callbacks die aufgelösten Werte jedes übergebenen Deferred-Objekts als separate Argumente – und zwar in der Reihenfolge, in der sie an $.when() übergeben wurden.
Dadurch lassen sich Daten aus mehreren Quellen einfach kombinieren und verarbeiten, sobald alle verfügbar sind.
Quiz zum Verketten von Promises
Betrachten Sie den folgenden jQuery-Codeausschnitt:
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();Welche Ausgabe wird LETZTENDLICH in der Konsole ausgegeben, und in welcher Reihenfolge?
Zusammenfassung: Verketten und Kombinieren
Sie haben gelernt, wie Sie komplexe asynchrone Abläufe verwalten:
- Verketten mit
.then(): Sequenziert Vorgänge und übergibt Ergebnisse von einer Stufe an die nächste. .pipe(): Eine ältere Methode zum Transformieren von Werten oder Zuordnen von Deferred-Objekten innerhalb einer Kette.- Kombinieren mit
$.when(): Wartet, bis mehrere unabhängige Deferred-Objekte parallel abgeschlossen sind, bevor die Ausführung fortgesetzt wird, und stellt ihre Ergebnisse als separate Argumente bereit.
Diese Muster sind entscheidend für robuste und gut lesbare asynchrone Anwendungen.
Häufig gestellte Fragen
Ist die Lektion „Promises verketten und kombinieren“ kostenlos?
Ja — der vollständige Text von „Promises verketten und kombinieren“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des jQuery Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der jQuery Academy-Kurs umfasst insgesamt 3 Lektionen.
Was lerne ich in „Promises verketten und kombinieren“?
Lernen Sie, mehrere asynchrone Vorgänge mit .then() und .pipe() zu verketten und komplexe Abläufe zu kombinieren, indem Sie mit $.when() auf den Abschluss mehrerer Promises warten. Du übst jQuery Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um jQuery Academy zu starten?
Keine Vorkenntnisse erforderlich. jQuery Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 3.
Wie lange dauert die Lektion „Promises verketten und kombinieren“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser jQuery Academy-Lektion Code schreiben und ausführen?
Ja. Jede jQuery Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Deferred-Objekte verstehen
- Promises verketten und kombinieren
- Mehrere asynchrone Aufgaben verarbeiten