Menu
CoddyTech

Async i Await

Część sekcji Podstawy Node.js ścieżki Node.js w Coddy. Lekcja 16 z 24.

Łańcuch wywołań .then przedstawia działania inaczej niż sposób, w jaki myślisz o kolejnych krokach: odczytaj, następnie sparsuj, a potem zapisz.

Wewnątrz funkcji async instrukcja await wstrzymuje działanie, aż obietnica zostanie rozstrzygnięta, i zwraca jej wartość. Odrzucona obietnica powoduje tam zgłoszenie wyjątku, 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.

challenge icon

Wyzwanie

Łatwy
  • store.js odczytuje i zapisuje teraz za pomocą node:fs/promises. Dodaj brakujące await, aby każde polecenie działało jak wcześniej.
  • notes.js oczekuje na store.add i store.remove, które są teraz async.

Najpierw uruchom node notes.js list, aby odczytać błąd, a gdy wszystko będzie działać, użyj poleceń add i done 1.

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 za pomocą 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;
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Podstawy Node.js