Menu
CoddyTech

Promise.all

Fa parte della sezione Fondamenti di Node.js del percorso Node.js di Coddy. Lezione 25 di 33.

Le letture indipendenti possono fornire parti diverse di un unico risultato. Avvia entrambe le operazioni, attendi i risultati, poi usa ciascun risultato per il suo scopo.

const [forecast, location] = await Promise.all([
    readFile('forecast.txt', 'utf8'),
    readFile('location.txt', 'utf8'),
]);
console.log(location + ': ' + forecast);

L'ordine dei risultati segue quello dell'array di input, anche se la seconda lettura termina per prima. Il tuo strumento per le note, invece, legge le note e un'impostazione di visualizzazione. La funzione helper readJson preparata gestisce i file mancanti e danneggiati. Formatta i numeri delle note prima di invertire l'ordine delle righe visualizzate, così cambiare visualizzazione non cambia la nota identificata da un numero.

challenge icon

Sfida

Facile

Questo passaggio apre il progetto dello strumento a riga di comando per le note fornito con il corso, anziché i file del tuo progetto di Async and Await (incluso store.js). Il lavoro precedente rimane nella sua lezione. Leggi i file forniti prima di modificare store.js. Questa copia contiene i comandi per le note, un lettore JSON e un file di configurazione.

Ora lo strumento per le note ha bisogno sia di notes.json sia di settings.json. L’helper readJson(name, fallback) fornito gestisce gli errori dei file esistenti.

  1. In store.js, sostituisci i segnaposto vuoti con i risultati della lettura di entrambi i file insieme a Promise.all. Se il file delle note non esiste, usa []; se le impostazioni non esistono, usa {}.
  2. In notes.js, il ramo list crea già righe numerate. Quando store.settings.sort è newest, inverti queste righe prima di stamparle. Qualsiasi altra impostazione mantiene l’ordine originale.

Prova list: dopo Notes for you, aspettati 2. Call Ada, 1. Buy milk. Modifica l’impostazione in oldest e riprova: gli stessi numeri appaiono in ordine crescente. Ripristina newest prima di verificare.

Provalo tu

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

// Sostituisci questi segnaposto con i due risultati di 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;

Tutte le lezioni di Fondamenti di Node.js

Esercitati da solo: Playground Express