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:
- Öffne die Datei
index.jsin deinem Code-Editor. - Fordere die erforderlichen Module am Anfang der Datei an:
const fs = require("fs");
const path = require("path");
- Definiere den Dateipfad für die Datei
test-promisefy.json:
const textPath = path.join(__dirname, "/test-promisefy.json");
- 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.
- Verwende die
promisefy-Funktion, um eine Promise-basierte Version derreadFile-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.
- Füge den folgenden Code zur Datei
index.jshinzu:
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.
- Jetzt sollte deine Datei
index.jsso 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;
- Führe die Datei
index.jsim 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.



