Erklärte JavaScript-Ereignisschleife: Aufrufstapel, Mikrotasks und Timer mit Beispielen

  1. Startseite
  2. Blog
  3. Softwareentwicklung

Softwareentwicklung

Erklärte JavaScript-Ereignisschleife: Aufrufstapel, Mikrotasks und Timer mit Beispielen

Warum läuft ein setTimeout von Null immer noch zuletzt? Wie kann ein Thread so viel auf einmal verarbeiten? Erfahren Sie, wie die Ereignisschleife wirklich funktioniert, testen Sie sie mit dem von uns ausgeführten Code und lösen Sie die klassische Interviewfrage.

9 Min. Lesezeit
JavaScript-Ereignisschleife erklärt: Aufrufstapel, Mikrotasks und Timer mit Beispielen

Das Wichtigste

  • JavaScript führt Ihren Code Stück für Stück in einem einzelnen Thread aus.
  • Wenn der Aufrufstapel leer ist, werden zuerst alle Mikrotasks ausgeführt und dann eine Aufgabe.
  • setTimeout(fn, 0) bedeutet „so bald wie möglich nach einer Mindestverzögerung“, nicht „jetzt“.
  • Lange synchrone Arbeit blockiert alles, also teilen Sie es auf oder verschieben Sie es auf einen Worker.

Führen Sie ein paar Zeilen mit setTimeout und einem Versprechen aus, und die Ausgabereihenfolge wird Sie vielleicht überraschen. Die JavaScript-Ereignisschleife erklärt warum. Es ist der Mechanismus, der es einer Single-Threaded-Sprache ermöglicht, Timer, Netzwerkaufrufe und Klicks ohne Einfrieren zu verarbeiten.

Sobald man es verstanden hat, beginnt eine ganze Klasse verwirrender Fehler einen Sinn zu ergeben. Wir haben jedes Beispiel auf Node.js 24 ausgeführt und die Ausgabe stammt von diesem Lauf. Die grundlegenden Bestellregeln gelten auch in Browsern, und wir weisen darauf hin, wo sich Node.js unterscheidet. Sie werden mehr davon haben, wenn Sie bereits die Grundlagen von JavaScript-Versprechen kennen.

Warum die Ereignisschleife existiert

JavaScript führt Ihren Code in einem Hauptthread aus, sodass jeweils nur ein Teil davon ausgeführt wird. Wenn einfach auf eine Netzwerkanfrage gewartet würde, würde eine Seite einfrieren, bis die Antwort zurückkäme.

JavaScript wartet also nicht. Langsame Arbeit wird an die Host-Umgebung übergeben, also an den Browser oder Node.js, die sie im Hintergrund erledigen können. Wenn diese Arbeit abgeschlossen ist, wird ein Rückruf in eine Warteschlange gestellt. Die Aufgabe der Ereignisschleife besteht darin, Rückrufe in der Warteschlange auf den Stapel zu verschieben, wenn dieser frei ist.

Stellen Sie sich einen Koch vor, der alleine arbeitet. Der Koch stellt ein Gericht in den Ofen und stellt einen Timer ein, anstatt darauf zu starren. Wenn der Timer klingelt, wird die Aufgabe auf eine Liste gesetzt und der Koch nimmt sie auf, nachdem er die aktuelle Aufgabe erledigt hat.

Die beweglichen Teile

Teil Was es bewirkt Beispiele
Aufrufstapel Verfolgt die aktuell ausgeführten Funktionen Ihr synchroner Code
Host-APIs Arbeiten Sie außerhalb Ihres Codes Timer, fetch, Datei liest
Aufgabenwarteschlange Enthält Rückrufe, die zur Ausführung bereit sind setTimeout, Klicks, E/A
Mikrotask-Warteschlange Hält Rückrufe mit höherer Priorität .then, await, queueMicrotask
Ereignisschleife Entscheidet, was als nächstes ausgeführt wird Läuft kontinuierlich

Aufgaben werden manchmal Makrotasks genannt. Streng genommen kann es mehrere Aufgabenquellen geben, und die genauen Details unterscheiden sich je nach Umgebung.

Die Regeln

  1. Führen Sie den gesamten synchronen Code aus, bis der Aufrufstapel leer ist.
  2. Führen Sie alle Mikrotasks aus, einschließlich aller neu hinzugefügten.
  3. Rendern Sie in einem Browser ein Update, falls eines fällig ist.
  4. Nehmen Sie eine Aufgabe aus einer Warteschlange und führen Sie sie aus.
  5. Gehen Sie zurück zu Schritt 2.

Das wichtigste Detail: alle Mikrotasks, dann eine Aufgabe. Die meisten Ereignisschleifenrätsel werden durch die Anwendung dieser einzigen Regel gelöst.

Siehe die Bestellung

console.log("1 sync");
setTimeout(() => console.log("5 timeout"), 0);
Promise.resolve().then(() => console.log("3 promise"));
queueMicrotask(() => console.log("4 microtask"));
console.log("2 sync");

// 1 sync
// 2 sync
// 3 promise
// 4 microtask
// 5 timeout

Hier ist, was passiert ist. Die beiden console.log Zeilen sind synchron, also liefen sie zuerst. Der Promise-Callback und queueMicrotask gingen in die Mikrotask-Warteschlange und wurden in der Reihenfolge ausgeführt, in der sie hinzugefügt wurden, sobald der Stapel leer war. Der Timer-Rückruf musste auf einen Task-Turn warten, obwohl seine Verzögerung Null war.

Mikrotasks laufen zwischen Timern

Nach jeder einzelnen Aufgabe wird die Microtask-Warteschlange wieder geleert. Dieses Beispiel beweist es:

setTimeout(() => {
  console.log("timer 1");
  Promise.resolve().then(() => console.log("promise inside timer 1"));
}, 0);
setTimeout(() => console.log("timer 2"), 0);

// timer 1
// promise inside timer 1
// timer 2

Das Versprechen, das während des ersten Timers erstellt wurde, wurde vor dem zweiten Timer ausgeführt. Moderne Browser und Node.js 11 und höher verhalten sich auf diese Weise.

Wo warten passt

await teilt eine Funktion in zwei Teile. Alles davor läuft synchron und alles danach ist als Mikrotask eingeplant. Das überrascht viele Menschen:

async function task() {
  console.log("A before await");
  await null;
  console.log("C after await");
}

task();
console.log("B after calling task");

// A before await
// B after calling task
// C after await

Eine async-Funktion startet nicht im Hintergrund. Es läuft im selben Thread, bis es seinen ersten await erreicht. Das gilt sogar, wenn man auf etwas wartet, das kein echtes Versprechen ist, wie zum Beispiel null. Weitere Informationen zu dieser Syntax finden Sie in unserem JavaScript-Async/Await-Leitfaden.

Blockieren der Schleife

Während synchroner Code ausgeführt wird, kann dies nichts anderes tun. Um dies zu zeigen, stellen wir einen Timer auf 0 ms und halten den Thread dann eine halbe Sekunde lang beschäftigt:

const start = Date.now();
setTimeout(() => console.log("timer ran after", Date.now() - start, "ms"), 0);
while (Date.now() - start < 500) {}

// timer ran after about 500 ms

Die Verzögerung des Timers ist ein Minimum und keine Garantie. Es wurde erst ausgeführt, als der Stapel frei wurde. Auf einer Webseite führt eine solche lange Schleife dazu, dass auf Klicks keine Reaktion erfolgt und die Animationen gestoppt werden. Auf einem Server muss jede andere Anfrage warten, weshalb ein langsamer synchroner Aufruf allen Benutzern eines Node.js-Prozesses schaden kann.

Zu den häufigsten Blockierungsursachen gehören große Schleifen, das Parsen sehr großer JSON-Dateien, synchrone Dateifunktionen wie readFileSync in Anforderungshandlern und katastrophale reguläre Ausdrücke.

Tipp: In Chrome DevTools markiert das Leistungsfenster Aufgaben, die länger als 50 ms dauern, als lange Aufgaben. Auf diese Weise können Sie schnell herausfinden, was dazu führt, dass sich eine Seite träge anfühlt.

Ansprechbar bleiben

Geben Sie der Ereignisschleife bei schwerer Arbeit eine Chance zum Atmen. Eine Möglichkeit besteht darin, ab und zu einen Timer anzuhalten, damit andere Aufgaben ausgeführt werden können:

const items = [0, 1, 2, 3, 4];

async function processAll() {
  for (const item of items) {
    if (item === 2) await new Promise((r) => setTimeout(r, 0));
    console.log("item", item);
  }
}

setTimeout(() => console.log("other work gets a turn"), 0);
processAll();

// item 0
// item 1
// other work gets a turn
// item 2
// item 3
// item 4

Der andere Timer lief in der Mitte, weil wir bei einer echten Aufgabe nachgegeben haben. Echter Code würde alle paar Elemente oder Millisekunden ergeben. Für wirklich CPU-intensive Arbeiten wie die Bildverarbeitung verwenden Sie einen Web Worker in Browsern oder einen Worker-Thread in Node.js, die auf separaten Threads ausgeführt werden.

Mikrotasking-Hunger

Da die Schleife die Mikrotask-Warteschlange vollständig leert, bevor sie fortfährt, kann eine Mikrotask, die immer mehr plant, alles andere stoppen. Wir haben dies mit 100.000 verketteten Mikrotasks getestet:

let count = 0;
let timerFired = false;
setTimeout(() => { timerFired = true; }, 0);

function spin() {
  count++;
  if (count < 100000) queueMicrotask(spin);
  else console.log("timer fired during microtasks?", timerFired);
}
queueMicrotask(spin);

// timer fired during microtasks? false

Der Timer konnte erst laufen, wenn alle fertig waren. Wenn diese Kette nie enden würde, würden die Timer nie ausgelöst und in einem Browser würde die Seite nie neu gezeichnet. Beachten Sie, dass das Nachgeben mit await bei einem gelösten Versprechen hier nicht hilft, da dadurch nur eine weitere Mikroaufgabe hinzugefügt wird. Sie benötigen eine echte Aufgabe, beispielsweise einen Timer, um anderen die Möglichkeit zu geben, an die Reihe zu kommen.

Rendern in Browsern

Ein Browser erhält normalerweise die Möglichkeit, zwischen Aufgaben zu malen. Das erklärt einen häufigen Fehler:

spinner.hidden = false;
doHeavyWork();              // blocks the thread
spinner.hidden = true;

Der Spinner erscheint nie, da der Browser keine Möglichkeit hatte, zwischen diesen Zeilen zu rendern. Um das Problem zu beheben, lassen Sie einen Rahmen passieren, bevor mit der schweren Arbeit begonnen wird, oder übertragen Sie diese Arbeit einem Arbeiter. Bei Code, der das Erscheinungsbild ändert, wird requestAnimationFrame direkt vor dem nächsten Mal ausgeführt, was es zum richtigen Werkzeug für Animationen macht.

Node.js-Unterschiede

Node.js verfügt über eine eigene Ereignisschleife mit mehreren Phasen, darunter Timer, I/O-Polling und setImmediate. Es verfügt auch über process.nextTick, das in einer eigenen Warteschlange ausgeführt wird. Folgendes haben wir gesehen, als wir diese innerhalb einer asynchronen Funktion ausgeführt haben:

setTimeout(() => console.log("timeout"), 0);
setImmediate(() => console.log("immediate"));
process.nextTick(() => console.log("nextTick"));
Promise.resolve().then(() => console.log("promise"));

// promise
// nextTick
// immediate
// timeout

In vielen Artikeln heißt es, dass nextTick Versprechen immer übertrifft und dass ein Timer besser ist als setImmediate. Unser Ergebnis zeigt, dass es nicht so einfach ist. Unser Code lief bereits innerhalb einer Mikrotask, also wurde die Promise-Warteschlange zuerst fortgesetzt. Und die Reihenfolge von setTimeout und setImmediate variiert bekanntermaßen je nachdem, woher sie aufgerufen werden. Schreiben Sie also keinen Code, der von der genauen Reihenfolge dieser Elemente abhängt. Wenn eine Sache nach der anderen passieren muss, verketten Sie sie explizit.

Interview-Quiz

Versuchen Sie, die Reihenfolge herauszufinden, bevor Sie die Antwort lesen:

console.log("a");
setTimeout(() => console.log("b"), 0);
Promise.resolve().then(() => {
  console.log("c");
  setTimeout(() => console.log("d"), 0);
  Promise.resolve().then(() => console.log("e"));
});
console.log("f");

Unser Lauf druckte a, f, c, e, b, d. Hier ist der Grund:

  1. a und f sind synchron, daher werden sie zuerst ausgeführt.
  2. Der Stapel ist leer, daher werden Mikrotasks ausgeführt: c, dann die neue Mikrotask e, in derselben Runde.
  3. Jetzt eine Aufgabe: Timer b, die zuerst in die Warteschlange gestellt wurde.
  4. Dann die nächste Aufgabe: Timer d, die während der Mikrotask in die Warteschlange gestellt wurde.

Häufige Fehler

  • Denken setTimeout ist genau. Die Verzögerung ist nur minimal.
  • Denken async bedeutet einen anderen Thread. Asynchroner Code wird zwischen Wartevorgängen immer noch im Hauptthread ausgeführt.
  • Sleeps verwenden, um die Reihenfolge zu korrigieren. Das Warten auf den tatsächlichen Zustand ist weitaus zuverlässiger, was auch für unzuverlässige Tests gilt.
  • Verwendung von forEach mit await. Es wird nicht zwischen Elementen gewartet. Siehe JavaScript-Array-Methoden.
  • Schwere synchrone Arbeit in einem Server-Handler ausführen. Eine Anfrage kann jede andere Anfrage verzögern.

Fazit

Denken Sie an die Grundregel: Führen Sie den Stapel aus, bis er leer ist, führen Sie alle Mikrotasks aus, führen Sie dann eine Aufgabe aus und wiederholen Sie den Vorgang. Alles Weitere ergibt sich daraus. Damit es hängen bleibt, schreiben Sie Ihre eigene Version des obigen Quiz, sagen Sie das Ergebnis auf Papier voraus und führen Sie es dann durch. Wenn Sie etwas falsch machen und verstehen, warum, erfahren Sie mehr als jedes Diagramm.

Häufige Fragen

Was ist die Ereignisschleife in JavaScript?

Es handelt sich um den Mechanismus, der Rückrufe in der Warteschlange ausführt, wenn der Aufrufstapel leer ist. Damit kann Single-Threaded-JavaScript Timer, Eingaben und Netzwerkantworten ohne Blockierung verarbeiten.

Was ist der Unterschied zwischen einer Mikrotask und einer Aufgabe?

Mikrotasks wie Promise-Callbacks werden alle ausgeführt, sobald der Stapel leer ist. Aufgaben wie Timer werden einzeln ausgeführt, wobei die Mikrotasks nacheinander gelöscht werden.

Warum wird setTimeout mit 0 nicht sofort ausgeführt?

Sein Rückruf muss auf eine Aufgabenumdrehung warten. Der gesamte synchrone Code und alle Mikrotasks werden zuerst ausgeführt, und die Verzögerung ist ein Minimum und keine genaue Zeit.

Ist JavaScript Single-Threaded?

Ihr Haupt-JavaScript-Code wird in einem Thread ausgeführt. Browser und Node.js nutzen andere Threads für einige Hintergrundarbeiten, und Worker ermöglichen die parallele Ausführung von Code.

Blockiert das Warten die Ereignisschleife?

Nein. „await“ pausiert nur diese asynchrone Funktion und anderer Code kann in der Zwischenzeit ausgeführt werden. Langer synchroner Code davor oder danach kann die Schleife jedoch immer noch blockieren.

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