Promise.all
Teil des Abschnitts Node.js-Grundlagen der Node.js-Journey von Coddy. Lektion 25 von 33.
Unabhängige Lesevorgänge können verschiedene Teile eines Ergebnisses liefern. Starte beide Vorgänge, warte auf ihre Ergebnisse und verwende dann jedes Ergebnis für seinen jeweiligen Zweck.
const [forecast, location] = await Promise.all([
readFile('forecast.txt', 'utf8'),
readFile('location.txt', 'utf8'),
]);
console.log(location + ': ' + forecast);Die Reihenfolge der Ergebnisse entspricht der des Eingabearrays, selbst wenn der zweite Lesevorgang zuerst abgeschlossen wird. Dein Notizentool liest stattdessen Notizen und eine Anzeigeeinstellung. Der vorbereitete readJson-Helfer behandelt fehlende und beschädigte Dateien. Formatiere die Notiznummern, bevor du die Anzeigereihenfolge umkehrst, damit sich beim Ändern der Ansicht nicht ändert, welche Notiz eine Nummer bezeichnet.
Aufgabe
EinfachDieser Schritt öffnet das vorbereitete Projekt des Kurses für ein Befehlszeilenprogramm für Notizen und nicht deine Projektdateien aus Async and Await (einschließlich store.js). Deine frühere Arbeit bleibt in ihrer eigenen Lektion. Lies die bereitgestellten Dateien, bevor du store.js bearbeitest. Diese Kopie enthält die Notizbefehle, den JSON-Leser und die Konfigurationsdatei.
Das Notizprogramm benötigt jetzt sowohl notes.json als auch settings.json. Die bereitgestellte Hilfsfunktion readJson(name, fallback) behält die vorhandene Behandlung von Dateifehlern bei.
- Ersetze in
store.jsdie leeren Platzhalter durch die Ergebnisse des gemeinsamen Einlesens beider Dateien mitPromise.all. Für eine fehlende Notizdatei wird[]verwendet; für fehlende Einstellungen{}. - Der Zweig
listinnotes.jserstellt bereits nummerierte Zeilen. Wennstore.settings.sortaufnewestgesetzt ist, kehre diese Zeilen vor der Ausgabe um. Bei jeder anderen Einstellung bleibt die ursprüngliche Reihenfolge erhalten.
Probiere list aus: Erwarte nach Notes for you die Ausgabe 2. Call Ada, 1. Buy milk. Ändere die Einstellung in oldest und probiere es erneut: Dieselben Nummern erscheinen in aufsteigender Reihenfolge. Stelle vor dem Prüfen wieder newest ein.
Probier es selbst
import { existsSync } from 'node:fs';
import { readFile, writeFile } from 'node:fs/promises';
const file = 'notes.json';
const readJson = async (name, fallback) => {
if (!existsSync(name)) {
return fallback;
}
try {
return JSON.parse(await readFile(name, 'utf8'));
} catch (err) {
console.error(`${name} is damaged: ${err.message}`);
process.exit(1);
}
};
// Ersetze diese Platzhalter durch die beiden Ergebnisse von readJson.
const notes = [];
const settings = {};
const store = {
notes,
settings,
async save() {
await writeFile(file, JSON.stringify(this.notes, null, 2));
},
async add(text) {
this.notes.push(text);
await this.save();
return this.notes.length;
},
async remove(n) {
const [text] = this.notes.splice(n - 1, 1);
await this.save();
return text;
},
};
export default store;
Alle Lektionen in Node.js-Grundlagen
Übe selbstständig: Express-Playground