Async i Await
Część sekcji Podstawy Node.js ścieżki Node.js w Coddy. Lekcja 23 z 33.
Łańcuch wywołań .then wygląda inaczej niż sposób, w jaki myślisz o kolejnych krokach: odczytaj, potem sparsuj, a następnie zapisz.
Wewnątrz funkcji async słowo await wstrzymuje działanie do momentu rozstrzygnięcia obietnicy i zwraca jej wartość. Nieudana obietnica zgłasza wyjątek w tym miejscu, więc obsługują ją try i catch. W module await działa również na najwyższym poziomie.
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);Funkcja async zawsze zwraca obietnicę, więc jej wywołujący również musi użyć await. Jeśli zapomnisz o await, otrzymasz samą obietnicę Promise { <pending> } zamiast jej wartości.
Wyzwanie
ŁatwyTen krok otwiera przygotowany w kursie projekt narzędzia wiersza poleceń do obsługi notatek, a nie pliki projektu z lekcji Promises (w tym count.js). Twoja wcześniejsza praca pozostaje w swojej lekcji. Przed edycją store.js przeczytaj dostarczone pliki. Ta kopia zawiera czytnik notatek oparty na obietnicach i obsługę błędów.
store.js używa teraz obietnicowych wersji readFile i writeFile, a jego metody są async. Jednak nic jeszcze nie czeka na obietnice, więc każde polecenie się psuje. Dodaj await wszędzie tam, gdzie obietnica musi zostać spełniona przed kolejnym krokiem.
- W
store.js, wload, zaczekaj nareadFile, zanimJSON.parseużyje tekstu. - W
store.jsfunkcjaloadjestasync, więc zwraca obietnicę. Zaczekaj na nią w miejscu, w którym magazyn ustawianotes. Moduł może używaćawaitna najwyższym poziomie, poza dowolną funkcją. - W
store.jszaczekaj nawriteFilewsaveoraz zaczekaj nathis.save()waddiremove. - W
notes.jsfunkcjestore.addistore.removesą terazasync. Zaczekaj na nie w gałęziachaddidone, abyniremovedzawierały wartości, a nie obietnice.
Łącznie daje to siedem wyrażeń await. Każde polecenie działa wtedy jak wcześniej. list wyświetla notatki z notes.json. Przy dwóch początkowych notatkach add Buy bread wyświetla Saved note 3., a następnie done 1 wyświetla Done: Buy milk.
Wypróbuj: wpisz list w polu po $ node notes.js, zanim cokolwiek zmienisz. Zobaczysz notes.json is damaged: ..., ale plik jest w porządku: do JSON.parse przekazano obietnicę zamiast tekstu z pliku. Po wprowadzeniu zmian list ponownie wyświetli notatki. Następnie wpisz add Buy bread i zobacz Saved note 3.. Wpisz done 1 i zobacz Done: Buy milk.
Spróbuj swoich sił
import { existsSync } from 'node:fs';
import { readFile, writeFile } from 'node:fs/promises';
const file = 'notes.json';
// readFile i writeFile zwracają teraz obietnice. Poczekaj na każdą z nich, używając await.
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;
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
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