„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 > Asynchrone Programmierung in JavaScript: Rückrufe vs. Versprechen vs. Async/Await

Asynchrone Programmierung in JavaScript: Rückrufe vs. Versprechen vs. Async/Await

Veröffentlicht am 31.07.2024
Durchsuche:101

Asynchronous Programming in JavaScript: Callbacks vs Promises vs Async/Await

Asynchrone Programmierung ist ein wichtiger Aspekt von JavaScript, der es Entwicklern ermöglicht, lange Netzwerkanfragen, Dateivorgänge und andere zeitaufwändige Aufgaben auszuführen, ohne den Hauptthread zu blockieren. Dadurch wird sichergestellt, dass Anwendungen reaktionsschnell und benutzerfreundlich bleiben. JavaScript bietet drei Hauptmethoden zur Handhabung asynchroner Vorgänge: Rückrufe, Versprechen und Asynchron/Warten. In diesem Artikel werden wir uns mit jeder dieser Methoden befassen und ihre Syntax, Verwendung und Unterschiede anhand detaillierter Beispiele untersuchen.

Inhaltsverzeichnis

  1. Einführung in die asynchrone Programmierung
  2. Rückrufe
    • Syntax und Beispiel
    • Vorteile und Nachteile
  3. Versprechen
    • Syntax und Beispiel
    • Versprechen verketten
    • Vorteile und Nachteile
  4. Asynchron/Warten
    • Syntax und Beispiel
    • Fehlerbehandlung
    • Vorteile und Nachteile
  5. Vergleich und Best Practices
  6. Abschluss

Einführung in die asynchrone Programmierung

In JavaScript können Vorgänge, deren Abschluss zeitaufwändig ist, wie das Abrufen von Daten von einem Server, das Lesen von Dateien oder das Durchführen von Berechnungen, asynchron abgewickelt werden. Das bedeutet, dass die JavaScript-Engine während des Wartens auf den Abschluss eines Vorgangs mit der Ausführung anderer Aufgaben fortfahren kann. Dies ist entscheidend für die Schaffung effizienter und reibungsloser Benutzererlebnisse in Webanwendungen.

Rückrufe

Syntax und Beispiel

Rückrufe sind eine der frühesten Methoden zur Verarbeitung asynchroner Vorgänge in JavaScript. Ein Rückruf ist einfach eine Funktion, die als Argument an eine andere Funktion übergeben wird und ausgeführt wird, sobald ein asynchroner Vorgang abgeschlossen ist.

function fetchData(callback) {
    setTimeout(() => {
        callback("Data fetched!");
    }, 1000);
}

function displayData(data) {
    console.log(data);
}

fetchData(displayData);

Im obigen Beispiel simuliert fetchData einen asynchronen Vorgang mit setTimeout. Nach 1 Sekunde ruft es die Funktion displayData auf und übergibt die abgerufenen Daten als Argument.

Vorteile und Nachteile

Vorteile:

  • Einfach und unkompliziert für kleine Aufgaben.
  • Bietet eine Möglichkeit, Code auszuführen, nachdem ein asynchroner Vorgang abgeschlossen ist.

Nachteile:

  • Kann zur „Callback-Hölle“ führen, wenn mehrere asynchrone Vorgänge verschachtelt sind, was das Lesen und Warten des Codes erschwert.
  • Die Fehlerbehandlung ist umständlich, da Fehler bei jedem Rückruf verwaltet werden müssen.

Versprechen

Syntax und Beispiel

Promises wurden in ES6 (ECMAScript 2015) eingeführt, um die mit Rückrufen verbundenen Probleme zu beheben. Ein Versprechen stellt einen Vorgang dar, der noch nicht abgeschlossen ist, aber in der Zukunft erwartet wird. Es kann einen von drei Status haben: „Ausstehend“, „Erfüllt“ oder „Abgelehnt“.

function fetchData() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("Data fetched!");
        }, 1000);
    });
}

fetchData()
    .then(data => {
        console.log(data);
    })
    .catch(error => {
        console.error("Error:", error);
    });

In diesem Beispiel gibt fetchData ein Promise zurück, das mit „Daten abgerufen!“ aufgelöst wird. nach 1 Sekunde. Die then-Methode wird verwendet, um den aufgelösten Wert zu verarbeiten, und Catch wird verwendet, um etwaige Fehler zu behandeln.

Versprechen verketten

Promises können verkettet werden, um eine Reihe asynchroner Vorgänge nacheinander auszuführen.

function fetchData() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("Data fetched!");
        }, 1000);
    });
}

function processData(data) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(`${data} Processed!`);
        }, 1000);
    });
}

fetchData()
    .then(data => {
        console.log(data);
        return processData(data);
    })
    .then(processedData => {
        console.log(processedData);
    })
    .catch(error => {
        console.error("Error:", error);
    });

In diesem Beispiel wird „processData“ nach „fetchData“ aufgerufen und die Ergebnisse werden der Reihe nach mit „then“ verarbeitet.

Vorteile und Nachteile

Vorteile:

  • Vermeidet die Callback-Hölle, indem es die Verkettung asynchroner Vorgänge ermöglicht.
  • Bietet integrierte Fehlerbehandlung mit Catch.
  • Verbessert die Lesbarkeit und Wartbarkeit des Codes.

Nachteile:

  • Kann bei mehreren verschachtelten then-Aufrufen immer noch komplex werden.
  • Die Fehlerbehandlung in einer Kette kann nicht trivial sein.

Asynchron/Warten

Syntax und Beispiel

Async/Await, eingeführt in ES2017, bietet eine besser lesbare und prägnante Möglichkeit, asynchronen Code mithilfe von Promises zu schreiben. Das Schlüsselwort „async“ wird zum Definieren einer asynchronen Funktion verwendet, und das Schlüsselwort „await“ wird verwendet, um die Ausführung anzuhalten, bis ein Versprechen aufgelöst ist.

async function fetchData() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("Data fetched!");
        }, 1000);
    });
}

async function displayData() {
    const data = await fetchData();
    console.log(data);
}

displayData();

In diesem Beispiel ist displayData eine asynchrone Funktion, die auf den Abschluss von fetchData wartet, bevor die Daten protokolliert werden.

Fehlerbehandlung

Die Fehlerbehandlung mit Async/Await kann mithilfe von Try/Catch-Blöcken erfolgen.

async function fetchData() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            reject("Failed to fetch data!");
        }, 1000);
    });
}

async function displayData() {
    try {
        const data = await fetchData();
        console.log(data);
    } catch (error) {
        console.error("Error:", error);
    }
}

displayData();

Wenn hier fetchData fehlschlägt, wird der Fehler vom Catch-Block abgefangen und protokolliert.

Vorteile und Nachteile

Vorteile:

  • Vereinfacht asynchronen Code, sodass er eher wie synchroner Code aussieht.
  • Verbessert die Lesbarkeit und Wartbarkeit des Codes.
  • Vereinfacht die Fehlerbehandlung mit Try/Catch-Blöcken.

Nachteile:

  • Erfordert Verständnis von Promises, da Async/Await darauf aufbaut.
  • Noch relativ neu, daher wird es von einigen Umgebungen möglicherweise nicht vollständig unterstützt.

Vergleich und Best Practices

Vergleich

  • Rückrufe: Geeignet für einfache, einstufige asynchrone Aufgaben, kann aber in komplexen Szenarien zur Rückrufhölle führen.
  • Versprechen: Verbessern Sie die Lesbarkeit und Verwaltbarkeit und ermöglichen Sie die Verkettung asynchroner Vorgänge. Integrierte Fehlerbehandlung mit Catch.
  • Async/Await: Bietet die am besten lesbare und wartbarste Möglichkeit, asynchronen Code zu schreiben. Vereinfacht die Fehlerbehandlung und sieht aus wie synchroner Code.

Empfohlene Vorgehensweise

  • Verwenden Sie Async/Await für die meisten Szenarien, in denen Sie asynchrone Vorgänge verarbeiten müssen. Es bietet die beste Lesbarkeit und Einfachheit.
  • Verwenden Sie Promises, wenn Sie mehrere asynchrone Vorgänge nacheinander ausführen müssen oder wenn Sie Bibliotheken verwenden, die Promises zurückgeben.
  • Vermeiden Sie Rückrufe, es sei denn, Sie arbeiten mit Legacy-Code oder wenn Sie sehr einfache asynchrone Aufgaben bearbeiten.

Abschluss

Asynchrone Programmierung in JavaScript ist für die Erstellung reaktionsfähiger und effizienter Anwendungen unerlässlich. Wenn Entwickler die Unterschiede zwischen Callbacks, Promises und Async/Await verstehen, können sie das richtige Tool für ihren spezifischen Anwendungsfall auswählen. Obwohl Rückrufe die einfachste Form der Verarbeitung asynchroner Vorgänge darstellen, können sie zu unübersichtlichem Code führen. Promises bieten einen strukturierteren Ansatz, aber Async/Await bietet die eleganteste und lesbarste Lösung. Durch die Befolgung von Best Practices und das Verständnis dieser Tools können Entwickler sauberen, wartbaren und effizienten asynchronen Code schreiben.

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/itsshaikhaj/asynchronous-programming-in-javascript-callbacks-vs-promises-vs-asyncawait-690?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