Menu
CoddyTech

Async y Await

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

Una cadena de llamadas a .then se lee de forma distinta a como piensas en los pasos: leer, después analizar y después guardar.

Dentro de una función async, await hace una pausa hasta que se resuelve una promesa y te da su valor. Si una promesa falla, se produce una excepción en ese punto, así que try y catch la gestionan. En un módulo, await también funciona en el nivel superior.

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 función async siempre devuelve una promesa, así que quien la llama también debe esperarla. Olvídate de un await y obtendrás la promesa misma, Promise { <pending> }, en lugar de su valor.

challenge icon

Desafío

Fácil
  • store.js ahora lee y escribe con node:fs/promises. Agrega los await que faltan para que cada comando funcione como antes.
  • notes.js espera a store.add y store.remove, que ahora son async.

Ejecuta primero node notes.js list para leer el error; después, cuando funcione, ejecuta add y done 1.

Pruébalo tú mismo

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

const file = 'notes.json';

// readFile y writeFile ahora devuelven promesas. Espera a cada una 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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

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