Menu
CoddyTech

Async e Await

Fa parte della sezione Fondamenti di Node.js del percorso Node.js di Coddy. Lezione 16 di 24.

Una catena di chiamate .then si legge diversamente da come pensi ai passaggi: leggi, poi analizza, poi salva.

All'interno di una funzione async, await mette in pausa l'esecuzione finché una promise non si risolve e ti fornisce il suo valore. Una promise non riuscita genera un errore in quel punto, quindi try e catch lo gestiscono. In un modulo, await funziona anche al livello superiore.

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);

Una funzione async restituisce sempre una promise, quindi anche chi la chiama deve usare await. Dimentica un await e otterrai la promise stessa, Promise { <pending> }, invece del suo valore.

challenge icon

Sfida

Facile
  • store.js ora legge e scrive con node:fs/promises. Aggiungi gli await mancanti affinché ogni comando funzioni come prima.
  • notes.js attende store.add e store.remove, che ora sono async.

Esegui prima node notes.js list per leggere l’errore, poi add e done 1 quando funziona.

Provalo tu

import { existsSync } from 'node:fs';
import { readFile, writeFile } from 'node:fs/promises';

const file = 'notes.json';

// readFile e writeFile ora restituiscono delle promise. Attendi ciascuna con 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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fondamenti di Node.js