Heim >Web-Frontend >js-Tutorial >Asynchrone Programmierung in JavaScript: Rückrufe vs. Versprechen vs. Async/Await

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

王林
王林Original
2024-07-17 20:13:121042Durchsuche

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

Asynchrone Programmierung ist ein Schlüsselaspekt 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. Fazit

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 sie auf den Abschluss eines Vorgangs wartet, 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.

Vor- 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 Methode then 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 Operationen 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 nacheinander mit „then“ verarbeitet.

Vor- 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.
  • 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.

Vor- 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: Verbessert die Lesbarkeit und Verwaltbarkeit und ermöglicht 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.

Best Practices

  • 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.

Das obige ist der detaillierte Inhalt vonAsynchrone Programmierung in JavaScript: Rückrufe vs. Versprechen vs. Async/Await. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn