Asynchrone Programmierung in JavaScript: Vollständiger Leitfaden für Node.js

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einführung in die asynchrone Programmierung in JavaScript



JavaScript ist eine Single-Thread-Programmiersprache mit einem nicht-blockierenden, ereignisgesteuerten Modell. In der Node.js-Umgebung ist asynchrone Programmierung nicht nur eine praktische Option, sondern eine grundlegende Notwendigkeit. Ohne Asynchronität würde eine Serveranwendung bei jeder Datenbankabfrage, jedem Dateizugriff oder Netzwerkaufruf blockieren und wäre für den realen Einsatz ungeeignet.



In diesem Leitfaden behandeln wir die drei wichtigsten Paradigmen der asynchronen Programmierung in JavaScript: Callback, Promise und async/await. Sie erfahren, wie der Event Loop funktioniert, lernen die Fehlerbehandlung und das Schreiben von lesbarem, leistungsfähigem Code für Node.js.



1. Callback: Die Grundlage der Asynchronität



Ein Callback (Rückruffunktion) ist eine Funktion, die als Argument an eine andere Funktion übergeben und nach Abschluss einer asynchronen Operation aufgerufen wird. Dies ist das älteste und grundlegendste Asynchronitätsmodell in JavaScript.



Einfaches Beispiel mit Callback



const fs = require('fs');

// Asynchrones Lesen einer Datei mit Callbackfs.readFile('example.txt', 'utf8', (err, data) => { if (err) { console.error('Fehler beim Lesen der Datei:', err); return; } console.log('Dateiinhalt:', data);});

console.log('Datei-Lesen gestartet...');// Ausgabe: "Datei-Lesen gestartet..." erscheint vor dem Dateiinhalt


In diesem Beispiel wird die Callback-Funktion erst ausgeführt, nachdem die Datei vollständig gelesen wurde. In der Zwischenzeit führt der Hauptthread die Ausführung fort – dies ist das nicht-blockierende Verhalten.



Callback Hell (Hölle der Rückruffunktionen)



Der Hauptnachteil von Callbacks ist der schnelle Verlust der Lesbarkeit bei verschachtelten Aufrufen:



// Hölle der RückruffunktionengetUser(1, (err, user) => {  if (err) throw err;  getPosts(user.id, (err, posts) => {    if (err) throw err;    getComments(posts[0].id, (err, comments) => {      if (err) throw err;      console.log(user.name, posts[0].title, comments);    });  });});


Dieser Code ist schwer zu debuggen, zu warten und zu erweitern. Glücklicherweise bietet modernes JavaScript weitaus elegantere Lösungen.



2. Promise: Versprechen eines Ergebnisses



Ein Promise ist ein Objekt, das das Ergebnis einer asynchronen Operation darstellt, die abgeschlossen (fulfilled), abgelehnt (rejected) oder in Bearbeitung (pending) sein kann. Promises ermöglichen es, Verschachtelungen zu vermeiden und Aufrufketten zu bilden.



Erstellung und Verwendung von Promise



// Funktion, die ein Promise zurückgibtfunction readFilePromise(filename) {  return new Promise((resolve, reject) => {    const fs = require('fs');    fs.readFile(filename, 'utf8', (err, data) => {      if (err) {        reject(err); // Fehler – Promise abgelehnt      } else {        resolve(data); // Erfolg – Promise erfüllt      }    });  });}

// Verwendung des PromisesreadFilePromise('example.txt') .then(data => { console.log('Inhalt:', data); return data.length; }) .then(length => { console.log('Textlänge:', length); }) .catch(err => { console.error('Fehler:', err); });


Methoden Promise.all und Promise.race



Promise.all ermöglicht das Warten auf die Erfüllung aller Promises, während Promise.race auf das erste abgeschlossene wartet:



const p1 = readFilePromise('file1.txt');const p2 = readFilePromise('file2.txt');const p3 = readFilePromise('file3.txt');

// Warten auf alle drei DateienPromise.all([p1, p2, p3]) .then(([data1, data2, data3]) => { console.log('Alle Dateien geladen'); console.log(data1, data2, data3); }) .catch(err => console.error('Fehler in einer der Dateien:', err));

// Warten auf die erste abgeschlossenePromise.race([p1, p2, p3]) .then(firstResult => { console.log('Erste Datei geladen:', firstResult); });


3. Async/Await: Synchroner Stil für asynchronen Code

Blogs

Buchempfehlungen