Menu
CoddyTech

Promise.all

Parte de la sección Conceptos básicos de Node.js del Journey de Node.js de Coddy. Lección 17 de 24.

La tienda ahora necesita dos archivos, las notas y la configuración, y leerlos uno después del otro hace que la espera dure el doble.

Promise.all([a, b]) permite que ambas promesas se ejecuten al mismo tiempo y espera hasta que las dos terminen. Devuelve sus resultados en el mismo orden que el arreglo y falla en cuanto una de ellas falla.

const [user, prefs] = await Promise.all([
    readFile('user.json', 'utf8'),
    readFile('prefs.json', 'utf8'),
]);

Úsalo cuando las lecturas no dependan unas de otras. Cuando la segunda necesite el resultado de la primera, espéralas una por una.

challenge icon

Desafío

Fácil
  • store.js lee notes.json y settings.json al mismo tiempo con Promise.all. Si falta el archivo de configuración, se considera que su valor es {}.
  • Cuando settings.json contiene "sort": "newest", list imprime primero la nota más reciente. Cada nota conserva su número.

Ejecuta node notes.js list. Después, cambia newest por oldest en settings.json y vuelve a ejecutarlo.

Pruébalo tú mismo

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

const file = 'notes.json';

const load = async () => {
    if (!existsSync(file)) {
        return [];
    }
    try {
        return JSON.parse(await readFile(file, 'utf8'));
    } catch (err) {
        console.error(`notes.json is damaged: ${err.message}`);
        process.exit(1);
    }
};

const store = {
    notes: await load(),
    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;

Todas las lecciones de Conceptos básicos de Node.js