Menu
CoddyTech

Promises

Teil des Abschnitts Node.js-Grundlagen der Node.js-Journey von Coddy. Lektion 15 von 24.

Rückrufe innerhalb von Rückrufen sind schwer nachzuvollziehen, und jeder muss daran denken, err zu überprü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 fehlgeschlagen ist, 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 innerhalb von .then ausgelöster Fehler landet ebenfalls in .catch, sodass ein einziger Handler sowohl das Lesen als auch das Parsen abdeckt. Ein Promise, das fehlschlägt und kein .catch hat, bringt das Programm zum Absturz.

challenge icon

Aufgabe

Einfach
  • Schreibe count.js mit readFile aus node:fs/promises und .then um.
  • Bei einer fehlenden Datei wird jetzt No notes yet ausgegeben, und zwar über ein .catch.
  • Done kommt weiterhin zuletzt, und zwar über .finally.

Führe zuerst node count.js und dann node count.js nothere.json aus.

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