Menu
CoddyTech

Promise.all

Parte da seção Fundamentos de Node.js do Journey de Node.js da Coddy. Lição 25 de 33.

Leituras independentes podem fornecer partes diferentes de um mesmo resultado. Inicie as duas operações, aguarde os resultados e então use cada resultado para sua finalidade.

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

A ordem dos resultados segue a do array de entrada, mesmo que a segunda leitura termine primeiro. Em vez disso, sua ferramenta de notas lê as notas e uma configuração de exibição. O auxiliar readJson preparado trata arquivos ausentes e danificados. Formate os números das notas antes de inverter a ordem das linhas exibidas, para que mudar a visualização nunca altere a nota identificada por um número.

challenge icon

Desafio

Fácil

Esta etapa abre o projeto da ferramenta de linha de comando de anotações preparado para o curso, em vez dos arquivos do seu projeto de Async and Await (incluindo store.js). Seu trabalho anterior permanece na própria lição. Leia os arquivos fornecidos antes de editar store.js. Esta cópia contém os comandos de anotações, um leitor de JSON e um arquivo de configuração.

Agora, a ferramenta de anotações precisa tanto de notes.json quanto de settings.json. O auxiliar readJson(name, fallback) fornecido mantém o tratamento de erros de arquivo existente.

  1. Em store.js, substitua os espaços reservados vazios pelos resultados da leitura dos dois arquivos juntos com Promise.all. Se o arquivo de anotações não existir, use []; se as configurações não existirem, use {}.
  2. Em notes.js, o ramo list já cria linhas numeradas. Quando store.settings.sort for newest, inverta essas linhas antes de imprimi-las. Qualquer outra configuração mantém a ordem original.

Experimente list: depois de Notes for you, espere 2. Call Ada, 1. Buy milk. Altere a configuração para oldest e experimente novamente: os mesmos números aparecem em ordem crescente. Restaure newest antes de verificar.

Experimente você mesmo

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

// Substitua esses valores provisórios pelos dois resultados de 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;

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

Pratique por conta própria: Playground de Express