Async und Await
Teil des Abschnitts Node.js-Grundlagen der Node.js-Journey von Coddy. Lektion 23 von 33.
Eine Kette von Aufrufen mit .then liest sich anders, als du über die Schritte nachdenkst: lesen, dann parsen, dann speichern.
Innerhalb einer async-Funktion pausiert await, bis ein Promise abgeschlossen ist, und liefert dir seinen Wert. Ein fehlgeschlagenes Promise löst dort einen Fehler aus, daher behandeln try und catch ihn. In einem Modul funktioniert await auch auf der obersten Ebene.
import { readFile } from 'node:fs/promises';
const loadConfig = async () => {
try {
return JSON.parse(await readFile('config.json', 'utf8'));
} catch {
return {};
}
};
const config = await loadConfig();
console.log(config.port ?? 3000);Eine async-Funktion gibt immer ein Promise zurück, daher muss auch ihr Aufrufer darauf warten. Vergisst du ein await, erhältst du statt des Werts das Promise selbst: Promise { <pending> }.
Aufgabe
EinfachIn diesem Schritt wird das vorbereitete Projekt des Kurses für ein Notizen-Befehlszeilentool geöffnet, nicht deine Projektdateien aus Promises (einschließlich count.js). Deine frühere Arbeit bleibt in ihrer eigenen Lektion. Lies die bereitgestellten Dateien, bevor du store.js bearbeitest. Diese Kopie enthält den promise-basierten Notizenleser und seine Fehlerbehandlung.
store.js verwendet jetzt die Promise-Versionen von readFile und writeFile, und seine Methoden sind async. Aber noch wartet nichts auf die Promises, deshalb schlägt jeder Befehl fehl. Füge überall dort await hinzu, wo ein Promise abgeschlossen sein muss, bevor der nächste Schritt ausgeführt wird.
- Warte in
store.jsinloadaufreadFile, bevorJSON.parseden Text verwendet. - In
store.jsistloadasyncund gibt daher ein Promise zurück. Warte darauf, wenn der Storenotesfestlegt. Ein Modul kannawaitauf der obersten Ebene außerhalb jeder Funktion verwenden. - Warte in
store.jsinsaveaufwriteFileund inaddundremoveaufthis.save(). - In
notes.jssindstore.addundstore.removejetztasync. Warte in den Zweigenaddunddoneauf sie, damitnundremovedWerte statt Promises enthalten.
Damit gibt es insgesamt sieben awaits. Danach funktioniert jeder Befehl wie zuvor. list zeigt die Notizen in notes.json an. Bei den beiden anfänglichen Notizen gibt add Buy bread Saved note 3. aus, und done 1 gibt danach Done: Buy milk aus.
Probier es aus: Gib list in das Feld nach $ node notes.js ein, bevor du etwas änderst. Du siehst notes.json is damaged: ..., aber die Datei ist in Ordnung: JSON.parse wurde statt des Dateitexts ein Promise übergeben. Nach deinen Änderungen zeigt list die Notizen wieder an. Gib dann add Buy bread ein und sieh dir Saved note 3. an. Gib done 1 ein und sieh dir Done: Buy milk an.
Probier es selbst
import { existsSync } from 'node:fs';
import { readFile, writeFile } from 'node:fs/promises';
const file = 'notes.json';
// readFile und writeFile geben jetzt Promises zurück. Warte mit await auf jedes einzelne.
const load = async () => {
if (!existsSync(file)) {
return [];
}
try {
return JSON.parse(readFile(file, 'utf8'));
} catch (err) {
console.error(`notes.json is damaged: ${err.message}`);
process.exit(1);
}
};
const store = {
notes: load(),
async save() {
writeFile(file, JSON.stringify(this.notes, null, 2));
},
async add(text) {
this.notes.push(text);
this.save();
return this.notes.length;
},
async remove(n) {
const [text] = this.notes.splice(n - 1, 1);
this.save();
return text;
},
};
export default store;
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Node.js-Grundlagen
Übe selbstständig: Express-Playground