import { mensagemDeErro } from './biblioteca.js'; /** * Parte 2 — Os três estados de uma Promise. * * npx tsx src/03-promises.ts */ import { buscarLivro, cronometro, LivroNaoEncontradoError } from './biblioteca.js'; const marcar = cronometro(); // --------------------------------------------------------------------------- // Pendente -> realizada. A transição é única: depois de liquidada, acabou. // --------------------------------------------------------------------------- const promessa = buscarLivro(1); marcar('a chamada retornou uma promise pendente — e a busca já começou'); promessa .then((livro) => { marcar(`then : ${livro.titulo}`); return livro.ano; }) .then((ano) => { marcar(`then : encadeado, o valor mudou de tipo — ano ${ano}`); }) .finally(() => { marcar('finally : roda nos dois desfechos, e não recebe o valor'); }); // A mesma promise pode ser observada quantas vezes se queira. Ela não é // reexecutada: o trabalho aconteceu uma vez, o resultado fica guardado. void promessa.then((livro) => { marcar(`then : segundo observador da MESMA promise — ${livro.autor}`); }); // --------------------------------------------------------------------------- // Pendente -> rejeitada. O `then` do caminho feliz é pulado. // --------------------------------------------------------------------------- buscarLivro(99) .then((livro) => { marcar(`este then NUNCA roda — ${livro.titulo}`); }) .catch((erro: unknown) => { const nome = erro instanceof LivroNaoEncontradoError ? erro.name : 'erro desconhecido'; marcar(`catch : ${nome} — ${mensagemDeErro(erro)}`); }) .finally(() => { marcar('finally : também roda depois de um catch'); }); /** * Três propriedades que valem a pena guardar: * * - Uma promise tem exatamente um destino: pendente até liquidar, e liquidada * como realizada ou rejeitada. Não volta atrás e não liquida duas vezes. * - Neste simulador, a chamada inicia a espera; isso não é regra de toda API * thenable (as consultas Prisma têm execução adiada). `buscarLivro(1)` já disparou a busca na * linha em que foi escrito. * - `then` devolve uma promise nova, com o valor que o callback retornou. * É isso que permite encadear e mudar o tipo do valor no meio do caminho. */