Erklärte JavaScript-Versprechen: then, Catch, Promise.all und häufige Fehler
Versprechen sind die Art und Weise, wie JavaScript Arbeit verarbeitet, die später abgeschlossen wird, und async/await baut darauf auf. Erfahren Sie anhand jedes Beispiels, wie sie sich wirklich verhalten, und vermeiden Sie die Fehler, die Ihre Fehler verschlingen.
- Ein Versprechen ist ein Objekt, das ein Ergebnis darstellt, das später verfügbar sein wird.
- Es bleibt bestehen, bis es entweder erfüllt oder abgelehnt wird, und sobald es erledigt ist, ändert es sich nie.
- Jedes
thengibt ein neues Versprechen zurück, was die Verkettung ermöglicht. - Verwenden Sie
Promise.all, wenn jedes Ergebnis erforderlich ist, undPromise.allSettled, wenn Sie jedes Ergebnis wünschen.
Netzwerkanfragen, Dateilesevorgänge und Timer werden alle später beendet, aber JavaScript kann nicht einfach anhalten und warten, sonst würde die Seite einfrieren. JavaScript-Versprechungen geben Ihnen eine klare Möglichkeit zu sagen: „Wenn dies erledigt ist, tun Sie das, und wenn es fehlschlägt, tun Sie stattdessen dies.“
Selbst wenn Sie hauptsächlich async und await schreiben, verwenden Sie darunter Versprechen, sodass das Debuggen erheblich einfacher wird, wenn Sie sie verstehen. Wir haben diese Beispiele auf Node.js 24 ausgeführt und die angezeigte Ausgabe stammt von diesem Lauf. In modernen Browsern verhalten sie sich genauso.
Was ist ein Versprechen?
Ein Versprechen ist ein Platzhalter für einen zukünftigen Wert. Denken Sie an den Summer, den Ihnen ein Restaurant gibt, wenn Sie bestellen. Sie haben Ihr Essen noch nicht, aber Sie halten etwas in der Hand, das Ihnen sagt, wann es fertig ist oder dass es ein Problem gibt, und in der Zwischenzeit können Sie andere Dinge tun.
Im Code gibt eine asynchrone Funktion sofort ein Versprechen zurück und Sie hängen an, was als nächstes passieren soll:
fetch("/api/user")
.then((response) => response.json())
.then((user) => console.log(user.name))
.catch((error) => console.log("Failed:", error.message));
Die drei Versprechensstaaten
| Staat | Bedeutung | Was läuft |
|---|---|---|
| Ausstehend | Die Arbeiten sind noch nicht abgeschlossen | Noch nichts |
| Erfüllt | Es endete mit einem Wert | then Handler |
| Abgelehnt | Es scheiterte mit einem Grund | catch Handler |
Ein Versprechen, das erfüllt oder abgelehnt wird, wird als erfüllt bezeichnet. Ein Versprechen kann nur einmal erfüllt werden. Danach werden Status und Wert festgelegt und spätere Aufrufe von resolve oder reject werden ignoriert.
Erstellen Sie ein Versprechen
Normalerweise konsumieren Sie Versprechen von APIs wie fetch, aber das Erstellen eines solchen zeigt, wie sie funktionieren. Der Konstruktor erhält zwei Funktionen, resolve und reject:
function fetchUser(id) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (id > 0) {
resolve({ id, name: "Asha" });
} else {
reject(new Error("Invalid id"));
}
}, 100);
});
}
console.log(fetchUser(1));
// Promise { <pending> }
Das sofortige Protokollieren des Versprechens zeigt, dass es noch aussteht, da der Timer nicht ausgelöst wurde. Der Wert kann nur über einen Handler oder await erreicht werden. Lehnen Sie immer mit einem Error-Objekt und nicht mit einer Zeichenfolge ab, da ein Error einen Stack-Trace enthält, der beim Debuggen hilft.
dann, fangen und endlich
Diese drei Methoden verknüpfen Handler mit einem Versprechen:
fetchUser(1).then((user) => console.log(user.name));
// Asha
fetchUser(-1)
.then((user) => console.log("never runs", user))
.catch((error) => console.log("caught:", error.message))
.finally(() => console.log("finally"));
// caught: Invalid id
// finally
then wird bei Erfolg ausgeführt, catch wird bei Fehler ausgeführt und finally wird in beide Richtungen ausgeführt. Das macht finally zum richtigen Ort für Aufräumarbeiten, beispielsweise zum Verstecken eines Ladespinners. Es erhält keine Argumente, da ihm das Ergebnis egal sein sollte.
Versprechen verketten
Die Schlüsselidee ist, dass then immer ein neues Versprechen zurückgibt. Was auch immer Ihr Handler zurückgibt, wird zum Wert dieses neuen Versprechens:
Promise.resolve(2)
.then((n) => n * 10)
.then((n) => n + 1)
.then((n) => console.log("chain:", n));
// chain: 21
Wenn ein Handler ein weiteres Versprechen zurückgibt, wartet die Kette, bis das Versprechen abgewickelt ist, bevor sie fortfährt. Dadurch werden verschachtelte Rückrufe zu einer flachen Abfolge von Schritten:
getUser(id)
.then((user) => getOrders(user.id))
.then((orders) => getInvoice(orders[0].id))
.then((invoice) => console.log(invoice.total))
.catch(handleError);
Wie Fehler durch eine Kette wandern
Ein abgelehntes Versprechen überspringt alle then, bis es eine catch erreicht. Als Zurückweisung gilt auch das Werfen in einen Hundeführer hinein. Und eine catch, die normalerweise zurückkehrt, bringt die Kette wieder auf Kurs:
Promise.resolve("start")
.then(() => {
throw new Error("step 2 failed");
})
.then(() => console.log("skipped"))
.catch((error) => {
console.log("caught:", error.message);
return "recovered";
})
.then((value) => console.log("continues:", value));
// caught: step 2 failed
// continues: recovered
Stellen Sie sich dies als die asynchrone Version von try und catch vor. Eine catch am Ende deckt normalerweise die gesamte Kette ab. Wenn Sie nur einen Fehler protokollieren möchten und dieser trotzdem fehlschlägt, werfen Sie ihn erneut aus catch.
Tipp: fetch lehnt nur bei Netzwerkfehlern ab. Eine 404- oder 500-Antwort wird immer noch erfüllt, also überprüfen Sie response.ok selbst. Unser Spickzettel für HTTP-Statuscodes erklärt, was jeder Code bedeutet.
Promise.all, allSettled, Rasse und alle
Diese statischen Methoden koordinieren mehrere Versprechen gleichzeitig. Sie alle nehmen ein Array und geben ein Versprechen zurück.
| Methode | Erfüllt wann | Lehnt wann ab | Benutze es für |
|---|---|---|---|
Promise.all |
Alle erfüllen | Jeder lehnt ab | Alle Ergebnisse sind erforderlich |
Promise.allSettled |
Alles erledigt | Niemals | Sie wollen jedes Ergebnis |
Promise.race |
Der erste, der sich niederlässt, erfüllt | Der Erste, der Ausschuss regelt | Auszeiten |
Promise.any |
Der erste erfüllt sich | Alle lehnen ab | Die erste erfolgreiche Quelle |
Um sie zu testen, haben wir zwei kleine Helfer verwendet, einen, der nach einer Verzögerung erfolgreich ist, und einen, der nach einer Verzögerung fehlschlägt:
const wait = (ms, value) =>
new Promise((resolve) => setTimeout(() => resolve(value), ms));
const fail = (ms, message) =>
new Promise((_, reject) => setTimeout(() => reject(new Error(message)), ms));
Promise.all
await Promise.all([wait(300, "a"), wait(100, "b"), wait(200, "c")]);
// [ 'a', 'b', 'c' ] took about 300 ms
Zwei Details, die es zu beachten gilt. Die Ergebnisse behalten die Eingabereihenfolge bei, auch wenn b zuerst fertig wurde. Und die Gesamtzeit betrug etwa 300 ms, die Zeit der langsamsten Aufgabe und nicht die 600 ms-Summe, da alle drei bereits gleichzeitig liefen. Wenn einer von ihnen ablehnt, lehnt das Ganze sofort ab:
await Promise.all([wait(100, "a"), fail(50, "b failed")]);
// rejected: b failed
Promise.allSettled
Dadurch wird auf alles gewartet und jedes Ergebnis gemeldet, sodass nicht ein Fehler den Rest verliert. Es eignet sich für ein Dashboard, bei dem jedes Widget unabhängig geladen wird:
const results = await Promise.allSettled([wait(50, "a"), fail(50, "b failed")]);
results.map((r) => r.status);
// [ 'fulfilled', 'rejected' ]
Promise.race und Promise.any
await Promise.race([wait(300, "slow"), wait(100, "fast")]); // fast
await Promise.any([fail(50, "x"), wait(100, "ok")]); // ok
Der Unterschied besteht darin, dass race die erste Lösung annimmt, auch wenn sie fehlschlägt, während any Fehler ignoriert, solange etwas erfolgreich ist. Eine klassische Verwendung von race besteht darin, einer langsamen Anfrage ein Timeout hinzuzufügen, obwohl die langsamere Aufgabe im Hintergrund weiterläuft, sofern Sie sie nicht abbrechen.
Versprechen und asynchron/warten
async und await sind eine besser lesbare Möglichkeit, mit denselben Versprechen zu arbeiten. Eine async-Funktion gibt immer ein Versprechen zurück und await hält diese Funktion an, bis ein Versprechen erfüllt ist:
async function showInvoice(id) {
try {
const user = await getUser(id);
const orders = await getOrders(user.id);
console.log(orders.length);
} catch (error) {
console.log("Failed:", error.message);
}
}
Ablehnungen werden zu geworfenen Fehlern, sodass normales try und catch funktioniert. Für paralleles Arbeiten benötigen Sie weiterhin Promise.all, da sie beim Warten auf einen Aufruf nach dem anderen nacheinander ausgeführt werden. Unser JavaScript-Async/Await-Leitfaden geht näher darauf ein.
Versprechen und die Ereignisschleife
Promise-Handler werden nie sofort angerufen, selbst wenn das Promise bereits erfüllt ist. Sie werden ausgeführt, nachdem der aktuelle Code beendet ist und vor etwaigen Timern. Hier ist der Beweis:
setTimeout(() => console.log("timeout"), 0);
Promise.resolve().then(() => console.log("microtask"));
console.log("sync");
// sync
// microtask
// timeout
Synchroner Code wird zuerst ausgeführt. Als nächstes kommt die Mikrotask-Warteschlange, die Promise-Handler enthält. Erst dann übernimmt die Ereignisschleife die nächste Aufgabe, beispielsweise einen Timer. Dies ist eine beliebte Frage in Vorstellungsgesprächen und sie erklärt, warum eine setTimeout von Null nicht wirklich unmittelbar ist.
Versprechen vs. Rückrufe
| Sorge | Rückrufe | Versprechen |
|---|---|---|
| Sequenzierung | Verschachtelt, tiefer bei jedem Schritt | Eine flache Kette |
| Fehler | Auf jeder Ebene überprüft | Einer catch kann die Kette abdecken |
| Paralleles Arbeiten | Manuelle Zähler | Promise.all |
| Aus Versehen zweimal angerufen? | Möglich | Man kann sich nicht zweimal zufrieden geben |
Häufige Fehler
- Vergessen, nach innen zurückzukehren
then. Ohne einereturnerhält der nächste Schrittundefinedund wartet nicht auf Ihr inneres Versprechen. - Überhaupt nicht
catch. Dies führt zu einer unbehandelten Ablehnung und stoppt in Node.js den Prozess standardmäßig. - Verschachtelung statt Verkettung. Das Einfügen von
theninthenerzeugt die Callback-Hölle. Geben Sie das Versprechen zurück und setzen Sie die Kette fort. - Ein Versprechen in
new Promiseeinschließen. Wenn eine Funktion bereits ein Versprechen zurückgibt, verwenden Sie es einfach. - Verwendung von
forEachmit asynchronen Rückrufen. Es wird nicht gewartet. Verwenden Siefor...ofoderPromise.allmitmap, wie in unserem Leitfaden zu JavaScript-Array-Methoden gezeigt. - Ich denke, ein Versprechen kann widerrufen werden. Es kann nicht von alleine erfolgen. Für Anfragen verwenden Sie
AbortController.
Fazit
Versprechen basieren auf ein paar Regeln: Ein Versprechen wird einmal erfüllt, then gibt ein neues Versprechen zurück und Fehler wandern die Kette entlang, bis sie von etwas erfasst werden. Sobald sich diese Regeln natürlich anfühlen, hören async und await auf, magisch zu sein. Um dies zu üben, schreiben Sie eine Callback-basierte Funktion mithilfe von Versprechen neu, rufen Sie dann zwei Endpunkte mit Promise.all ab und behandeln Sie einen Fehler ordnungsgemäß.
Häufige Fragen
Was ist ein Versprechen in JavaScript?
Ein Versprechen ist ein Objekt, das das letztendliche Ergebnis einer asynchronen Arbeit darstellt. Es beginnt mit „Ausstehend“ und wird dann entweder mit einem Wert erfüllt oder mit einem Grund abgelehnt.
Was ist der Unterschied zwischen then und Catch?
Dann wird ausgeführt, wenn ein Versprechen erfüllt wird, und Catch wird ausgeführt, wenn es abgelehnt wird. Catch funktioniert dann effektiv nur mit einem Ablehnungshandler und kann auch Fehler abfangen, die in früheren Schritten ausgegeben wurden.
Was ist der Unterschied zwischen Promise.all und Promise.allSettled?
Promise.all lehnt ab, sobald ein Versprechen abgelehnt wird. Promise.allSettled wartet immer auf alle und meldet den Status und den Wert oder Grund jedes einzelnen.
Sollte ich Versprechen oder Async/Await verwenden?
Sie arbeiten zusammen, denn das Warten basiert auf Versprechen. Der meiste Code lässt sich am besten mit async/await lesen, während Promise.all und ähnliche Methoden für paralleles Arbeiten nützlich bleiben.
Laufen Versprechen parallel?
JavaScript führt jeweils einen Codeabschnitt in einem Thread aus, funktioniert jedoch wie Netzwerkanforderungen im Hintergrund. Es können mehrere davon gleichzeitig ausgeführt werden.
Lerne weiter
Benötigen Sie Hilfe beim Testen, WordPress oder SEO?
Wir helfen Teams, bessere Software zu liefern und ihre Websites zu erweitern. Sagen Sie uns, woran Sie gerade arbeiten, und wir schlagen Ihnen einen klaren nächsten Schritt vor.
Weitere Anleitungen finden Sie unter Tests, KI und moderne Entwicklung
Hat Ihnen dieser Artikel gefallen? Wählen Sie ein Thema und springen Sie direkt in unsere neuesten Tutorials.
KI-Halluzinationen erklärt: Warum Sprachmodelle Dinge erfinden und wie man sie reduziert
KI-Halluzinationen erklärt: Was sie sind, warum Sprachmodelle sie produzieren, gängige Typen, wie man sie mit Erdung und Eingabeaufforderungen reduz…
Artikel lesen →DevOpsErklärte Umgebungsvariablen: .env-Dateien, Geheimnisse und Konfiguration richtig gemacht
Umgebungsvariablen anhand von Python-Beispielen erklärt, die wir ausgeführt haben: Sie lesen und festlegen, warum jeder Wert ein String ist, .env-Da…
Artikel lesen →SoftwareentwicklungAPI-Ratenbegrenzung erklärt: Algorithmen, Header und Behandlung von 429-Fehlern
API-Ratenbegrenzung anhand einer von uns durchgeführten Simulation erklärt: Token-Bucket, festes Fenster, gleitendes Fenster, 429 Antworten, Ratenbe…
Artikel lesen →TestautomatisierungSpott in Python: unittest.mock, Patch und die Fehler, die Tests zum Lügen machen
Mocking in Python mit unittest.mock, getestet: Mock und return_value, side_effect, Patchen, wo ein Name verwendet wird, Spezifikation und Autospec, …
Artikel lesen →SoftwaretestsCode-Abdeckung erklärt: Leitungs- und Zweigstellenabdeckung und was 100 % wirklich bedeutet
Erklärung der Codeabdeckung anhand eines echten Coverage.py-Laufs: Zeilen-, Zweig- und Bedingungsabdeckung, Lesen eines Berichts, warum bei 100 % Ab…
Artikel lesen →Datenbanken & SQLDELETE vs. TRUNCATE vs. DROP in SQL: Unterschiede, Rollback und Verwendungszweck
DELETE vs. TRUNCATE vs. DROP erklärt mit getestetem SQL: was jeweils entfernt wird, Rollback, Trigger, Identitätsrücksetzung, Geschwindigkeit und wi…
Artikel lesen →Datenbanken & SQLErklärte SQL-Ansichten: Erstellen, nutzen und vermeiden Sie Fallstricke mit Beispielen
SQL-Ansichten anhand der von uns ausgeführten Abfragen erklärt: Erstellen einer Ansicht, Live-Ergebnisse, Ausblenden von Spalten, Leistung, aktualis…
Artikel lesen →SoftwareentwicklungTypeScript-Schnittstelle vs. Typ: Echte Unterschiede, getestet mit dem Compiler
TypeScript-Schnittstelle vs. Typ, überprüft mit dem echten Compiler: Was beide können, was nur einer kann, Deklarationszusammenführung, Erweiterunge…
Artikel lesen →SoftwareentwicklungPython *args und **kwargs erklärt: Flexible Funktionen mit klaren Beispielen
Python *args und **kwargs erklärt mit Code, den wir ausgeführt haben: Packen und Entpacken, Parameterreihenfolge, Nur-Schlüsselwort- und Nur-Positio…
Artikel lesen →SoftwareentwicklungPython-Lambda-Funktionen: Syntax, tatsächliche Verwendung und wann man sie nicht verwendet
Python-Lambda-Funktionen erklärt mit Code, den wir ausgeführt haben: Syntax, Sortierung mit Schlüssel, Karte und Filter, Abschlüsse, die Late-Bindin…
Artikel lesen →Künstliche IntelligenzWas sind KI-Agenten? Wie sie funktionieren, mit einer einfachen Agentenschleife, die Sie ausführen können
Was sind KI-Agenten? Eine einfache Anleitung zur Agentenschleife, zu Tools, Speicher und Leitplanken, mit einer kleinen Python-Schleife, die wir aus…
Artikel lesen →DevOpsÜberwachung vs. Beobachtbarkeit: Der wahre Unterschied, mit Protokollen, Metriken und Traces
Überwachung vs. Beobachtbarkeit erklärt: bekannte und unbekannte Fehler, Protokolle, Metriken und Spuren, eine exemplarische Vorgehensweise für Chec…
Artikel lesen →DevOpsDocker-Volumes vs. Bind Mounts: Containerdaten auf die richtige Art und Weise beibehalten
Docker-Volumes vs. Bind-Mounts erklärt: Warum Containerdaten verschwinden, benannte Volumes, Bind-Mounts, tmpfs, Compose-Beispiele, Backups, Berecht…
Artikel lesen →TestautomatisierungTDD vs. BDD: Hauptunterschiede, eine Funktion, die auf beide Arten entwickelt wurde und wann sie jeweils verwendet werden sollte
TDD vs. BDD erklärt mit einer Rabattfunktion, die in beide Richtungen aufgebaut ist: Rot-Grün-Refaktor mit Code, den wir ausgeführt haben, Gegeben-W…
Artikel lesen →SoftwaretestsBenutzerakzeptanztests (UAT): Prozess, Checkliste und reale Beispiele
Benutzerakzeptanztests erklärt: Wer führt ihn durch, wie unterscheidet er sich von der Qualitätssicherung, ein siebenstufiger Prozess, eine UAT-Test…
Artikel lesen →Datenbanken & SQLErklärte SQL-NULL-Werte: IS NULL, COALESCE, NULLIF und die zu vermeidenden Fallen
SQL-NULL-Werte, die mit von uns ausgeführten Abfragen erklärt wurden: dreiwertige Logik, IS NULL, COALESCE, NULLIF, wie Aggregate, Joins und Sortier…
Artikel lesen →Datenbanken & SQLSQL CASE WHEN-Anweisung: Syntax, reale Beispiele und häufige Fehler
SQL CASE WHEN anhand der von uns ausgeführten Abfragen erklärt: einfache und durchsuchte Formulare, Bedingungsreihenfolge, Pivots mit SUM, COUNT-Tri…
Artikel lesen →SoftwareentwicklungWas ist JWT? JSON-Web-Tokens anhand eines funktionierenden Beispiels erklärt
Was ist JWT? JSON Web Tokens erklärt: die drei Teile, ein Token, das in dem von uns ausgeführten Code erstellt und manipuliert wurde, JWT vs. Sitzun…
Artikel lesen →SoftwareentwicklungErklärte JavaScript-Ereignisschleife: Aufrufstapel, Mikrotasks und Timer mit Beispielen
Die JavaScript-Ereignisschleife wurde mit dem von uns ausgeführten Code erklärt: Aufrufstapel, Aufgaben- und Mikrotask-Warteschlangen, warum setTime…
Artikel lesen →SoftwareentwicklungErklärung von Python-Generatoren und -Ertrag: Sparen Sie Speicher mit echten Beispielen
Python-Generatoren und Yield anhand des von uns ausgeführten Codes erklärt: wie sie angehalten und fortgesetzt werden, gemessene Speichereinsparunge…
Artikel lesen →Künstliche IntelligenzWas sind Einbettungen? Vektoren und Kosinusähnlichkeit einfach erklärt
Was sind Einbettungen? Ein Leitfaden in einfacher Sprache zu Vektoren, Kosinusähnlichkeit und semantischer Suche, mit einem kleinen Beispiel, das wi…
Artikel lesen →DevOpsBlau-Grün vs. Canary-Bereitstellung: Unterschiede, Kompromisse und Auswahl
Blue-Green vs. Canary-Bereitstellung erklärt: Funktionsweise, Kosten, Risiko und Rollback, stabiles Benutzer-Bucketing, das wir getestet haben, Date…
Artikel lesen →TestautomatisierungFlaky-Tests: Was sie verursacht und wie man sie endgültig behebt
Flaky-Tests wurden anhand von Demos erklärt, die wir durchgeführt haben: die Hauptursachen, wie man sie bestätigt und diagnostiziert, richtige Korre…
Artikel lesen →SoftwaretestsLasttest vs. Stresstest: Unterschiede, Metriken und k6-Beispiele
Erläuterungen zu Lasttests und Stresstests: Was die einzelnen Tests beweisen, Spike- und Soak-Tests, welche Kennzahlen wichtig sind, warum Durchschn…
Artikel lesen →SoftwaretestsTestfall vs. Testszenario: Hauptunterschiede, Beispiele und wann man sie jeweils verwendet
Testfall vs. Testszenario erklärt: klare Definitionen, eine Tabelle nebeneinander, eine Funktion zum Zurücksetzen von Passwörtern, die von Szenarios…
Artikel lesen →Datenbanken & SQLSQL-Abfrageoptimierung: Ausführungspläne lesen und langsame Abfragen mit Zeitvorgaben beheben
An einer Million Zeilen getestete SQL-Abfrageoptimierung: Ausführungspläne lesen, die richtigen Indizes hinzufügen, nicht sargierbare Filter korrigi…
Artikel lesen →Datenbanken & SQLSQL UNION vs. UNION ALL: Unterschiede, Beispiele und getestete Leistung
SQL UNION vs. UNION ALL anhand der von uns ausgeführten Abfragen erklärt: Duplikate, die Regeln, denen beide folgen, ein echter Datenfehler, gemesse…
Artikel lesen →SoftwareentwicklungTutorial zur JavaScript-Abruf-API: GET, POST, Fehlerbehandlung und Zeitüberschreitungen
Ein JavaScript-Abruf-API-Tutorial, das auf einem lokalen Server getestet wurde: GET und POST, warum 404 nicht ausgelöst wird, ein wiederverwendbarer…
Artikel lesen →SoftwareentwicklungUmgang mit Python-Dateien: Lesen, Schreiben, CSV, JSON und Pathlib mit Beispielen
Die Handhabung von Python-Dateien wird anhand des von uns ausgeführten Codes erklärt: Öffnungsmodi, Lesen großer Dateien, CSV, JSON, Pathlib, Binärd…
Artikel lesen →SoftwareentwicklungPython-Klassen und -Objekte: OOP-Tutorial mit echten Beispielen
Python-Klassen und -Objekte erklärt mit Code, den wir ausgeführt haben: __init__, Methoden, Klassen- und Instanzattribute, Vererbung, Eigenschaften,…
Artikel lesen →Künstliche IntelligenzWas ist ein großes Sprachmodell? Wie LLMs funktionieren, ohne großen Hype erklärt
Was ist ein großes Sprachmodell? LLMs im Klartext erklärt: Token, Einbettungen, Aufmerksamkeit, Training, Temperatur- und Kontextfenster, eine klein…
Artikel lesen →DevOpsLinux-Befehle für Anfänger: Der grundlegende Terminal-Leitfaden mit Beispielen
Linux-Befehle für Anfänger, gruppiert nach Aufgaben: Navigation, Dateien, Anzeigen von Protokollen, Grep, Pipes, Berechtigungen, Prozesse und Archiv…
Artikel lesen →TestautomatisierungSelenium vs. Playwright: Hauptunterschiede, Code im Vergleich und welche Sie wählen sollten
Selenium vs. Playwright im Vergleich: Architektur, Wartezeit, Browser- und Sprachunterstützung, Debugging, der gleiche Test in beiden Tools, Migrati…
Artikel lesen →SoftwaretestsÄquivalenzpartitionierung: Testdesigntechnik anhand von Beispielen erklärt
Erklärung der Äquivalenzpartitionierung: Wie man gültige und ungültige Partitionen findet, Beispiele für Alter, Passwörter und Gutscheine, von uns d…
Artikel lesen →SoftwaretestsSchweregrad vs. Priorität beim Softwaretest: Unterschiede, Matrix und reale Beispiele
Schweregrad vs. Priorität beim Softwaretest erklärt: klare Definitionen, eine Vier-Wege-Matrix mit Beispielen, Stufenskalen, wer die einzelnen Punkt…
Artikel lesen →Datenbanken & SQLTutorial zu SQL-Unterabfragen: Typen, korrelierte Unterabfragen und EXISTS mit Beispielen
Ein SQL-Unterabfrage-Tutorial mit Abfragen, die wir ausgeführt haben: Skalar-, IN-, FROM- und SELECT-Unterabfragen, korrelierte Unterabfragen, EXIST…
Artikel lesen →Datenbanken & SQLSQL-Transaktionen und ACID erklärt: COMMIT, ROLLBACK und Isolationsstufen
SQL-Transaktionen und ACID anhand einer von uns durchgeführten Banküberweisung erklärt: COMMIT, ROLLBACK, Sicherungspunkte, Sperren, Isolationsstufe…
Artikel lesen →SoftwareentwicklungSpickzettel für Git-Befehle: Die Befehle, die Sie tatsächlich verwenden, mit Beispielen
Ein Git-Befehls-Spickzettel, gruppiert nach Aufgabe: Setup, Staging, Branches, Remotes, Stash, Verlauf und Rückgängigmachen von Fehlern, mit Ausgabe…
Artikel lesen →SoftwareentwicklungErklärte JavaScript-Versprechen: Dann, Catch, Promise.all und häufige Fehler
JavaScript-Versprechen erklärt mit Code, den wir ausgeführt haben: Zustände, dann und Fangketten, Fehlerbehandlung, Promise.all, allSettled, Rennen …
Artikel lesen →SoftwareentwicklungPython-Wörterbuch-Tutorial: Methoden, Beispiele und gängige Muster
Ein Python-Wörterbuch-Tutorial mit Code, den wir ausgeführt haben: Diktate erstellen, lesen und aktualisieren, Schlüsselmethoden, Zusammenführung, V…
Artikel lesen →Künstliche IntelligenzWas ist RAG? Retrieval-Augmented Generation anhand eines Arbeitsbeispiels erklärt
Was ist RAG? Abruf-erweiterte Generierung Schritt für Schritt erklärt: Indizierung, Chunking, Einbettungen, Abruf, ein kleines funktionierendes Pyth…
Artikel lesen →DevOpsTerraform-Tutorial für Anfänger: Infrastruktur als Code von der ersten Datei bis zu den Modulen
Ein Terraform-Tutorial für Anfänger: Beginnen Sie ohne Cloud-Konto, lernen Sie Init, Planen und Anwenden, dann Variablen, Ausgaben, Status, Module u…
Artikel lesen →DevOpsDocker vs. Kubernetes: Hauptunterschiede, wie sie zusammenarbeiten und was Sie brauchen
Docker vs. Kubernetes erklärt: Was jeder tut, die gleiche App läuft mit beiden, Docker Compose und Swarm im Vergleich, die Dockershim-Änderung und w…
Artikel lesen →TestautomatisierungPytest-Tutorial für Anfänger: Vorrichtungen, Parametrisierung und reale Beispiele
Ein Pytest-Tutorial für Anfänger mit Tests, die wir auf Pytest 9.2 durchgeführt haben: Assertions, Fixtures, Parametrize, Conftest, Markers, tmp_pat…
Artikel lesen →SoftwaretestsSoftware Testing Life Cycle (STLC): 6 Phasen, Einstiegs- und Ausstiegskriterien, Beispiel
Der Softwaretest-Lebenszyklus erklärt: sechs STLC-Phasen mit Ein- und Ausstiegskriterien, Ergebnisse, ein Beispiel für eine funktionierende Anmeldef…
Artikel lesen →SoftwareentwicklungGit merge vs rebase: Unterschiede, Beispiele und wann man was nutzt
Git merge vs rebase erklärt mit echter Log-Ausgabe, einer Vergleichstabelle, der goldenen Regel des Rebase und einem sicheren Team-Workflow.
Artikel lesen →SoftwareentwicklungPython List Comprehension: Syntax, Beispiele und wann man darauf verzichtet
Python List Comprehension erklärt: Syntax, Filter, if-else, verschachtelte Schleifen, gemessene Zeiten und Fälle, in denen eine normale for-Schleife…
Artikel lesen →Datenbanken & SQLSQL Joins erklärt mit Beispielen (Inner, Left, Right, Full)
SQL Joins Schritt für Schritt mit Beispieltabellen und Abfragen verstehen: INNER, LEFT, RIGHT, FULL, CROSS und SELF, plus typische Fehler und Perfor…
Artikel lesen →