Promises
Teil des Abschnitts Node.js-Grundlagen der Node.js-Journey von Coddy. Lektion 21 von 33.
Callbacks innerhalb von Callbacks sind schwer nachzuvollziehen, und jeder muss daran denken, err zu prüfen.
node:fs/promises gibt stattdessen ein Promise zurück: ein Objekt, das für ein später eintreffendes Ergebnis steht. .then(fn) wird mit dem Ergebnis ausgeführt, .catch(fn) wird ausgeführt, wenn ein vorheriger Schritt fehlschlägt, und .finally(fn) wird in jedem Fall ausgeführt.
import { readFile } from 'node:fs/promises';
readFile('poem.txt', 'utf8')
.then((text) => console.log(text.length + ' characters'))
.catch(() => console.log('No poem today'))
.finally(() => console.log('Bye'));Ein Fehler, der innerhalb von .then ausgelöst wird, landet ebenfalls in .catch, sodass ein Handler sowohl das Lesen als auch das Parsen abdeckt. Ein Promise, das fehlschlägt und kein .catch hat, bringt das Programm zum Absturz.
Aufgabe
EinfachDieser Schritt öffnet das vorbereitete Projekt des Kurses für ein Notizen-Befehlszeilentool und nicht deine Projektdateien aus Callbacks (einschließlich count.js). Deine frühere Arbeit bleibt in ihrer eigenen Lektion. Lies die bereitgestellten Dateien, bevor du count.js bearbeitest. Diese Kopie enthält das Beispiel zum asynchronen Zählen von Notizen.
- Schreibe
count.jsmitreadFileausnode:fs/promisesund.thenneu. - Bei einer fehlenden Datei wird jetzt
No notes yetausgegeben, und zwar über ein.catch. Donesteht weiterhin am Ende und stammt aus.finally.
Führe node count.js aus und dann node count.js nothere.json.
Ohne Argument lautet die Ausgabe Reading..., 2 notes und dann Done, jeweils in einer eigenen Zeile. Mit nothere.json lautet die mittlere Zeile No notes yet.
Probier es selbst
import fs from 'node:fs';
const file = process.argv[2] ?? 'notes.json';
console.log('Reading...');
fs.readFile(file, 'utf8', (err, text) => {
if (err) {
console.log(`Cannot read ${file}`);
} else {
console.log(`${JSON.parse(text).length} notes`);
}
console.log('Done');
});
Alle Lektionen in Node.js-Grundlagen
Übe selbstständig: Express-Playground