Promisifizierung von auf Callbacks basierenden asynchronen Funktionen

JavaScriptJavaScriptBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Projekt lernst du, wie du eine asynchrone Funktion, die auf Callbacks basiert, in JavaScript zu einer Promise-basierten Funktion umwandeln kannst. Genauer gesagt wirst du die auf Callbacks basierende readFile-Funktion aus dem fs-Modul in Node.js in eine Promise-basierte Version umwandeln.

🎯 Aufgaben

In diesem Projekt wirst du lernen:

  • Wie du die Bedingungen für die Umwandlung einer Funktion in eine Promise-basierte Funktion identifizierst
  • Wie du eine promisefy-Funktion implementierst, um eine auf Callbacks basierende Funktion zu umschließen und eine Promise zurückzugeben
  • Wie du die Promise-basierte Version der readFile-Funktion verwendest, um eine Datei asynchron zu lesen

🏆 Errungenschaften

Nach Abschluss dieses Projekts wirst du in der Lage sein:

  • Die Vorteile der Verwendung von Promises gegenüber der auf Callbacks basierenden asynchronen Programmierung zu verstehen
  • Eine generische promisefy-Funktion zu implementieren, um auf Callbacks basierende Funktionen in Promise-basierte Funktionen umzuwandeln
  • Promise-basierte asynchrone Funktionen in eigenen Projekten zu nutzen, um die Code-Lesbarkeit und die Fehlerbehandlung zu verbessern

Promisify die readFile-Funktion

In diesem Schritt lernst du, wie du die readFile-Funktion aus dem fs-Modul in Node.js zu einer Promise-basierten Funktion umwandeln kannst. Folge den Schritten unten, um diesen Schritt abzuschließen:

  1. Öffne die Datei index.js in deinem Code-Editor.
  2. Fordere die erforderlichen Module am Anfang der Datei an:
const fs = require("fs");
const path = require("path");
  1. Definiere den Dateipfad für die Datei test-promisefy.json:
const textPath = path.join(__dirname, "/test-promisefy.json");
  1. Implementiere die promisefy-Funktion:
const promisefy = (fn) => {
  return (textPath, type) => {
    return new Promise((resolve, reject) => {
      fn(textPath, type, (err, contrast) => {
        if (err) {
          reject(err);
        } else {
          resolve(contrast);
        }
      });
    });
  };
};

Die promisefy-Funktion nimmt eine auf Callbacks basierende Funktion fn als Argument und gibt eine neue Funktion zurück, die eine Promise zurückgibt. Die zurückgegebene Funktion ruft die ursprüngliche fn-Funktion auf und löst die Promise mit dem Ergebnis oder lehnt sie mit dem Fehler ab.

  1. Verwende die promisefy-Funktion, um eine Promise-basierte Version der readFile-Funktion zu erstellen:
const readFileSync = promisefy(fs.readFile);

Jetzt kannst du die readFileSync-Funktion verwenden, um die Datei test-promisefy.json asynchron mit Promises zu lesen.

Lese die Datei mit der Promise-basierten readFile-Funktion

In diesem Schritt lernst du, wie du die Promise-basierte readFileSync-Funktion verwendest, um die Datei test-promisefy.json zu lesen.

  1. Füge den folgenden Code zur Datei index.js hinzu:
fs.readFile(textPath, "utf8", (err, contrast) => {
  const readFileSync = promisefy(fs.readFile);

  readFileSync(textPath, "utf8")
    .then((res) => {
      console.log(res === contrast); // Das Ergebnis hier ist erwartet: true, d.h. die Promise liefert den gleichen Inhalt wie das vorherige Lesen.
    })
    .catch((err) => {});
});

Dieser Code ruft die readFileSync-Funktion mit dem Dateipfad und der Codierung auf und behandelt dann die Promise-Lösung und -ablehnung mit den then- und catch-Methoden.

  1. Jetzt sollte deine Datei index.js so aussehen:
const fs = require("fs");
const path = require("path");
const textPath = path.join(__dirname, "/test-promisefy.json");

fs.readFile(textPath, "utf8", (err, contrast) => {
  const readFileSync = promisefy(fs.readFile);

  readFileSync(textPath, "utf8")
    .then((res) => {
      console.log(res === contrast); // Das Ergebnis hier ist erwartet: true, d.h. die Promise liefert den gleichen Inhalt wie das vorherige Lesen.
    })
    .catch((err) => {});
});

const promisefy = (fn) => {
  return (textPath, type) => {
    return new Promise((resolve, reject) => {
      fn(textPath, type, (err, contrast) => {
        if (err) {
          reject(err);
        } else {
          resolve(contrast);
        }
      });
    });
  };
};

module.exports = promisefy;
  1. Führe die Datei index.js im Terminal aus:
node index

Du solltest die Ausgabe true sehen, was bedeutet, dass die Promise-basierte readFile-Funktion den gleichen Inhalt wie die ursprüngliche callback-basierte readFile-Funktion zurückgegeben hat.

Herzlichen Glückwunsch! Du hast die readFile-Funktion erfolgreich zu einer Promise-basierten Funktion umgewandelt und die Promise-basierte Version verwendet, um eine Datei zu lesen.

✨ Lösung prüfen und üben

Zusammenfassung

Herzlichen Glückwunsch! Du hast dieses Projekt abgeschlossen. Du kannst in LabEx weitere Übungen absolvieren, um deine Fähigkeiten zu verbessern.