Promise.all
Część sekcji Podstawy Node.js ścieżki Node.js w Coddy. Lekcja 25 z 33.
Niezależne odczyty mogą dostarczyć różne części jednego wyniku. Rozpocznij obie operacje, poczekaj na ich wyniki, a następnie wykorzystaj każdy z nich do własnego celu.
const [forecast, location] = await Promise.all([
readFile('forecast.txt', 'utf8'),
readFile('location.txt', 'utf8'),
]);
console.log(location + ': ' + forecast);Kolejność wyników odpowiada kolejności elementów w tablicy wejściowej, nawet jeśli drugi odczyt zakończy się jako pierwszy. Twoje narzędzie do notatek odczytuje natomiast notatki i ustawienie wyświetlania. Przygotowana funkcja pomocnicza readJson obsługuje brakujące i uszkodzone pliki. Formatuj numery notatek przed odwróceniem kolejności wyświetlanych wierszy, aby zmiana widoku nigdy nie zmieniała tego, którą notatkę wskazuje dany numer.
Wyzwanie
ŁatwyTen krok otwiera przygotowany w kursie projekt narzędzia wiersza poleceń do notatek, a nie pliki projektu z lekcji Async and Await (w tym store.js). Twoja wcześniejsza praca pozostaje w swojej lekcji. Przed edycją store.js przeczytaj dostarczone pliki. Ta kopia zawiera polecenia do obsługi notatek, czytnik JSON i plik konfiguracji.
Narzędzie do notatek potrzebuje teraz zarówno notes.json, jak i settings.json. Dostarczona funkcja pomocnicza readJson(name, fallback) zachowuje dotychczasową obsługę błędów plików.
- W
store.jszastąp puste symbole zastępcze wynikami jednoczesnego odczytu obu plików za pomocąPromise.all. Jeśli brakuje pliku z notatkami, użyj[]; jeśli brakuje ustawień, użyj{}. - W
notes.jsgałąźlistjuż tworzy ponumerowane wiersze. Gdystore.settings.sortma wartośćnewest, odwróć kolejność tych wierszy przed ich wyświetleniem. Każda inna wartość ustawienia zachowuje pierwotną kolejność.
Wypróbuj list: po Notes for you oczekuj 2. Call Ada, 1. Buy milk. Zmień ustawienie na oldest i spróbuj ponownie: te same numery pojawią się w kolejności rosnącej. Przed sprawdzeniem przywróć newest.
Spróbuj swoich sił
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);
}
};
// Zastąp te wartości zastępcze dwoma wynikami funkcji 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;
Wszystkie lekcje w sekcji Podstawy Node.js
1Uruchamianie JavaScript w Node
Witaj, NodeOdczytywanie poleceniaArgumenty wiersza poleceńPolecenia5Zdarzenia, dane wejściowe i pakiety
Nasłuchuj przed emisjąEmitery zdarzeńOdczytywanie danych wejściowychPoćwicz samodzielnie: Edytor online Express