Erklärte JavaScript-Versprechen: Dann, Catch, Promise.all und häufige Fehler

  1. Startseite
  2. Blog
  3. Softwareentwicklung

Softwareentwicklung

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.

10 Min. Lesezeit
JavaScript-Versprechen erklärt: Dann, Catch, Promise.all und häufige Fehler

Das Wichtigste

  • 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 then gibt ein neues Versprechen zurück, was die Verkettung ermöglicht.
  • Verwenden Sie Promise.all, wenn jedes Ergebnis erforderlich ist, und Promise.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 eine return erhält der nächste Schritt undefined und 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 then in then erzeugt die Callback-Hölle. Geben Sie das Versprechen zurück und setzen Sie die Kette fort.
  • Ein Versprechen in new Promise einschließen. Wenn eine Funktion bereits ein Versprechen zurückgibt, verwenden Sie es einfach.
  • Verwendung von forEach mit asynchronen Rückrufen. Es wird nicht gewartet. Verwenden Sie for...of oder Promise.all mit map, 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

Arbeiten Sie mit Stack Quora

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.

Lesen Sie weiter

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.

Künstliche Intelligenz

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 →
DevOps

Erklä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 →
Softwareentwicklung

API-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 →
Testautomatisierung

Spott 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 →
Softwaretests

Code-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 & SQL

DELETE 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 & SQL

Erklä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 →
Softwareentwicklung

TypeScript-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 →
Softwareentwicklung

Python *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 →
Softwareentwicklung

Python-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 Intelligenz

Was 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 →
DevOps

Docker-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 →
Testautomatisierung

TDD 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 →
Softwaretests

Benutzerakzeptanztests (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 & SQL

Erklä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 & SQL

SQL 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 →
Softwareentwicklung

Was 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 →
Softwareentwicklung

Erklä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 →
Softwareentwicklung

Erklä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 Intelligenz

Was 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 →
DevOps

Blau-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 →
Testautomatisierung

Flaky-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 →
Softwaretests

Lasttest 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 →
Softwaretests

Testfall 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 & SQL

SQL-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 & SQL

SQL 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 →
Softwareentwicklung

Tutorial 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 →
Softwareentwicklung

Umgang 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 →
Softwareentwicklung

Python-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 Intelligenz

Was 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 →
DevOps

Linux-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 →
Testautomatisierung

Selenium 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 →
Softwaretests

Schweregrad 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 & SQL

Tutorial 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 & SQL

SQL-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 →
Softwareentwicklung

Spickzettel 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 →
Softwareentwicklung

Erklä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 →
Softwareentwicklung

Python-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 Intelligenz

Was 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 →
DevOps

Terraform-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 →
DevOps

Docker 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 →
Testautomatisierung

Pytest-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 →
Softwaretests

Software 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 →
Softwareentwicklung

Git 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 →
Softwareentwicklung

Python 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 & SQL

SQL 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 →