„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Die Callback-Hölle verstehen: Das Problem, Lösungen und Codebeispiele

Die Callback-Hölle verstehen: Das Problem, Lösungen und Codebeispiele

Veröffentlicht am 08.11.2024
Durchsuche:963

Understanding Callback Hell: The Problem, Solutions and Code Examples

Die Callback-Hölle ist auch ein heißes Thema in technischen Interviews, da sie das Verständnis eines Entwicklers für asynchronen Code und seine Fähigkeit, Code für eine bessere Lesbarkeit und Wartbarkeit umzugestalten, auf die Probe stellt.

Einführung

Asynchrone Programmierung ist in der modernen JavaScript-Entwicklung von entscheidender Bedeutung, da sie eine nicht blockierende Ausführung ermöglicht und die Leistung verbessert, insbesondere bei E/A-gebundenen Vorgängen. Allerdings kann diese Annehmlichkeit manchmal zu einem Zustand führen, der bekanntermaßen als „Rückrufhölle“ bekannt ist.

In diesem Artikel befassen wir uns mit Folgendem:

  1. Was die Callback-Hölle ist und wie sie entsteht.
  2. Die Probleme, die dadurch entstehen.
  3. Lösungen, einschließlich der Verwendung von Promises und async/await.
  4. Codebeispiele, um alles klar zu machen.

Was ist die Callback-Hölle?

Die Callback-Hölle, oft auch als „Pyramide des Untergangs“ bezeichnet, tritt auf, wenn mehrere verschachtelte asynchrone Vorgänge aufeinander angewiesen sind, um nacheinander ausgeführt zu werden. Dieses Szenario führt zu einem Wirrwarr tief verschachtelter Rückrufe, wodurch der Code schwer zu lesen, zu warten und zu debuggen ist.

Beispiel für Callback Hell:

getData(function(data) {
  processData(data, function(processedData) {
    saveData(processedData, function(response) {
      sendNotification(response, function(notificationResult) {
        console.log("All done!");
      });
    });
  });
});

Der obige Code führt nacheinander mehrere asynchrone Vorgänge aus. Obwohl es funktioniert, wird es schnell unüberschaubar, wenn weitere Aufgaben hinzugefügt werden, was es schwierig macht, es zu verstehen und zu warten. Die verschachtelte Struktur ähnelt einer Pyramide, daher der Begriff „Pyramide des Untergangs“.

Das Problem mit der Callback-Hölle

Die Rückrufhölle führt zu mehreren Problemen:

  1. Schwer zu warten: Tief verschachtelter Code ist schwer zu ändern/erweitern. Sie könnten Fehler verursachen, indem Sie einfach versuchen, neue Funktionen hinzuzufügen.
  2. Fehlerbehandlung: Die ordnungsgemäße Fehlerbehandlung über verschiedene verschachtelte Ebenen hinweg wird komplex. Sie müssen Fehler für jeden einzelnen Rückruf behandeln, was zu wiederholtem Code führen kann.
  3. Lesbarkeit des Codes: Das Verständnis des Ausführungsflusses wird zu einer Herausforderung, insbesondere für Entwickler, die mit der Codebasis nicht vertraut sind.
  4. Skalierbarkeit: Mit zunehmender Anzahl verschachtelter Rückrufe steigt auch die Komplexität, wodurch der Code nicht skalierbar und schwer zu debuggen ist.

Versprechen: Eine Lösung für die Callback-Hölle

Um die Probleme der Callback-Hölle zu mildern, werden in JavaScript Promises verwendet. Versprechen stellen den eventuellen Abschluss (oder Misserfolg) eines asynchronen Vorgangs dar und ermöglichen es Ihnen, sauberen, besser verwaltbaren Code zu schreiben. Versprechen vereinfachen den Code - Mit Versprechen wird die verschachtelte Struktur abgeflacht und die Fehlerbehandlung zentralisiert, wodurch der Code einfacher zu lesen und zu warten ist.

So würde das frühere Callback-Höllen-Beispiel mit Promises aussehen:

getData()
 .then(data => processData(data))
 .then(processedData => saveData(processedData))
 .then(response => sendNotification(response))
 .then(notificationResult => {
 console.log("All done!");
 })
 .catch(error => {
 console.error("An error occurred:", error);
 });

Dieser Ansatz eliminiert tief verschachtelte Rückrufe. Jeder „Dann“-Block stellt den nächsten Schritt in der Kette dar, wodurch der Ablauf viel linearer und einfacher zu verfolgen ist. Die Fehlerbehandlung ist ebenfalls im „catch“-Block zentralisiert.

Wie Versprechen funktionieren

Versprechen haben drei mögliche Zustände:

  1. Ausstehend: Der Ausgangszustand, was bedeutet, dass das Versprechen noch nicht erfüllt oder abgelehnt wurde.
  2. Erfüllt: Der asynchrone Vorgang wurde erfolgreich abgeschlossen.
  3. Abgelehnt: Der Vorgang ist fehlgeschlagen.

Ein Promise-Objekt stellt die Methoden „.then()“ und „.catch()“ bereit, um Erfolgs- und Misserfolgsszenarien zu verarbeiten.

function getData() {
 return new Promise((resolve, reject) => {
 // Simulating an async operation (e.g., API call)
 setTimeout(() => {
 const data = "Sample Data";
 resolve(data);
 }, 1000);
 });
}
getData()
 .then(data => {
 console.log("Data received:", data);
 })
 .catch(error => {
 console.error("Error fetching data:", error);
 });

Im obigen Code gibt die Funktion „getData()“ ein Versprechen zurück. Wenn der asynchrone Vorgang erfolgreich ist, wird das Versprechen mit den Daten erfüllt, andernfalls wird es mit einem Fehler abgelehnt.

Versprechen verketten

Einer der Hauptvorteile von Promises besteht darin, dass sie verkettet werden können. Dadurch können asynchrone Vorgänge ohne Verschachtelung sequenziert werden.

function fetchData() {
 return new Promise((resolve, reject) => {
 setTimeout(() => resolve("Data fetched"), 1000);
 });
}
function processData(data) {
 return new Promise((resolve, reject) => {
 setTimeout(() => resolve(`${data} and processed`), 1000);
 });
}
function saveData(data) {
 return new Promise((resolve, reject) => {
 setTimeout(() => resolve(`${data} and saved`), 1000);
 });
}
fetchData()
 .then(data => processData(data))
 .then(processedData => saveData(processedData))
 .then(result => {
 console.log(result); 
// Output => Data fetched and processed and saved
 })
 .catch(error => console.error("Error:", error));

Durch die Verkettung von Promises wird der Code flacher, besser lesbar und einfacher zu warten.

Async/Await: Eine noch bessere Alternative

Obwohl Versprechen eine deutliche Verbesserung gegenüber Rückrufen darstellen, können sie bei umfangreichen Ketten dennoch umständlich werden. Hier kommt async/await ins Spiel.
Die Async/await-Syntax ermöglicht es uns, asynchronen Code auf eine Weise zu schreiben, die synchronem Code ähnelt. Es macht Ihren Code sauberer und einfacher zu überlegen.

Async/Await verwenden:

async function performOperations() {
  try {
    const data = await getData();
    const processedData = await processData(data);
    const response = await saveData(processedData);
    const notificationResult = await sendNotification(response);

    console.log("All done!");
  } catch (error) {
    console.error("Error:", error);
  }
}

performOperations();

Im obigen Code:

  • Das Schlüsselwort „async“ wird verwendet, um eine asynchrone Funktion zu definieren.
  • 'await' hält die Ausführung der Funktion an, bis das Versprechen aufgelöst oder abgelehnt wird, wodurch der Code synchron aussieht.
  • Die Fehlerbehandlung ist viel einfacher, wenn ein einzelner „Try-Catch“-Block verwendet wird.
  • Async/await eliminiert die Callback-Hölle und lange Versprechensketten und ist damit die bevorzugte Methode zur Handhabung asynchroner Vorgänge in modernem JavaScript.

Abschluss

Callback Hell ist ein häufiges Problem in JavaScript, das bei der Arbeit mit mehreren asynchronen Vorgängen auftritt. Tief verschachtelte Rückrufe führen zu nicht wartbarem und fehleranfälligem Code. Mit der Einführung von Promises und async/await haben Entwickler nun jedoch Möglichkeiten, saubereren, besser verwaltbaren und skalierbaren Code zu schreiben.

Promises flacht verschachtelte Rückrufe ab und zentralisiert die Fehlerbehandlung, während async/await die asynchrone Logik weiter vereinfacht, indem es sie synchron erscheinen lässt. Beide Techniken beseitigen das Chaos der Callback-Hölle und stellen sicher, dass Ihr Code auch bei zunehmender Komplexität lesbar bleibt.

Social-Media-Handles
Wenn Sie diesen Artikel hilfreich fanden, können Sie sich gerne auf meinen Social-Media-Kanälen mit mir in Verbindung setzen, um weitere Einblicke zu erhalten:

  • GitHub: [AmanjotSingh0908]
  • LinkedIn: [Amanjot Singh Saini]
  • Twitter: [@AmanjotSingh]

Danke fürs Lesen!

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/amanjotsingh/understanding-callback-hell-the-problem-solutions-and-code-examples-3loh?1 Bei Verstößen wenden Sie sich bitte an [email protected] um es zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3