/** * Parte 3 — async/await. * * npx tsx src/04-async-await.ts */ import { buscarLivro, cronometro, esperar, LivroNaoEncontradoError } from './biblioteca.js'; const marcar = cronometro(); // --------------------------------------------------------------------------- // 1. Toda função `async` devolve uma Promise — inclusive quando retorna um // número. O tipo declarado tem de dizer isso. // --------------------------------------------------------------------------- async function anoDePublicacao(id: number): Promise { const livro = await buscarLivro(id); return livro.ano; // um number; a função devolve Promise } // --------------------------------------------------------------------------- // 2. `await` suspende a FUNÇÃO, não o programa. Enquanto a ficha espera, o // relógio abaixo continua batendo — prova de que nada foi bloqueado. // --------------------------------------------------------------------------- async function ficha(id: number): Promise { marcar('ficha : entrou na função'); const livro = await buscarLivro(id); marcar('ficha : voltou do await'); return `${livro.titulo} (${livro.ano})`; } async function relogio(): Promise { for (let batida = 1; batida <= 3; batida += 1) { await esperar(100); marcar(`relógio : batida ${batida}`); } } // --------------------------------------------------------------------------- // 3. Erro assíncrono vira exceção comum diante de `await`. // --------------------------------------------------------------------------- async function fichaSegura(id: number): Promise { try { const livro = await buscarLivro(id); return livro.titulo; } catch (erro) { // Sob `strict`, `erro` é `unknown`: o compilador exige que você prove o // que ele é antes de usar. Ver a Parte 7. if (erro instanceof LivroNaoEncontradoError) { return `sem ficha (livro ${erro.livroId})`; } throw erro; } finally { marcar('fichaSegura: finally roda nos dois caminhos'); } } async function principal(): Promise { const [texto] = await Promise.all([ficha(1), relogio()]); marcar(`resultado : ${texto}`); marcar(`ano : ${await anoDePublicacao(2)}`); marcar(`ausente : ${await fichaSegura(99)}`); } void principal(); /** * `async`/`await` não é um mecanismo novo: é notação para o que a Parte 2 * mostrou com `then` e `catch`. O que muda é que o fluxo volta a ser lido de * cima para baixo, e o `catch` da linguagem volta a funcionar. * * O que NÃO muda: o trabalho continua acontecendo fora da sua função, e a * thread continua livre. `await` é um ponto de retomada, não uma parada. */