Promisifizierung von auf Callbacks basierenden asynchronen Funktionen

JavaScriptBeginner
Jetzt üben

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

Promisifizieren Sie 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.

Zusammenfassung

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

✨ Lösung prüfen und üben✨ Lösung prüfen und üben