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.
Desafio
FácilEsta 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.
- Em
store.js, substitua os espaços reservados vazios pelos resultados da leitura dos dois arquivos juntos comPromise.all. Se o arquivo de anotações não existir, use[]; se as configurações não existirem, use{}. - Em
notes.js, o ramolistjá cria linhas numeradas. Quandostore.settings.sortfornewest, 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