Menu
CoddyTech

Async e Await

Parte da seção Fundamentos de Node.js do Journey de Node.js da Coddy. Lição 16 de 24.

Uma cadeia de chamadas .then é diferente da maneira como você pensa nas etapas: ler, depois analisar e, então, salvar.

Dentro de uma função async, await pausa até que uma promessa seja liquidada e fornece seu valor. Uma promessa rejeitada gera uma exceção nesse ponto, então try e catch a tratam. Em um módulo, await também funciona no nível 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);

Uma função async sempre retorna uma promessa, então quem a chama também precisa usar await. Esqueça um await e você obterá a própria promessa, Promise { <pending> }, em vez do valor dela.

challenge icon

Desafio

Fácil
  • store.js agora lê e grava usando node:fs/promises. Adicione os awaits que faltam para que cada comando funcione como antes.
  • notes.js aguarda store.add e store.remove, que agora são async.

Execute node notes.js list primeiro para ler o erro, depois add e done 1 quando funcionar.

Experimente você mesmo

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

const file = 'notes.json';

// readFile e writeFile agora retornam promessas. Aguarde cada uma com 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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Fundamentos de Node.js