Até aqui, vimos exemplos com Promises que, à primeira vista, parecem desnecessários.

Isso levanta uma dúvida muito justa:

“Isso não poderia ser feito com uma função simples?”

Nesta aula, vamos responder essa pergunta com exemplos reais — mostrando situações onde:

  • Funções simples funcionam
  • Funções simples quebram
  • Promises resolvem
  • async/await simplifica drasticamente

🎯 Objetivo da aula

Ao final desta aula, você será capaz de:

  • Saber quando uma função simples é suficiente
  • Entender quando Promises são necessárias
  • Reconhecer problemas assíncronos reais
  • Usar async/await para reduzir complexidade

Caso 1 — Função simples funciona

Quando tudo acontece imediatamente, uma função simples é perfeita.

 
  function dobrar(numero) { 
    return numero * 2; 
  }
  console.log(dobrar(4)); // Saída será 8

Aqui:

  • Não há espera
  • Não há erro assíncrono
  • Não há dependência externa

👉 **Promises seriam exagero.**

Caso 2 — Função simples quebra

Agora imagine um dado que só chega depois.

 
  function buscarUsuario() 
  { 
    setTimeout(() => 
    { return 
    { nome: "Daniel" }; 
    }, 1000); 
  }
  const usuario = buscarUsuario();
  console.log(usuario);
 console.log(usuario); // Saída será undefined 

Por quê?

  • O return acontece dentro do callback
  • A função termina antes do dado existir

👉 **Aqui a função simples falha.**

Caso 3 — Promise resolve o problema

Agora o mesmo problema resolvido corretamente:

 
  function buscarUsuario() 
  { 
    return new Promise(resolve => 
    { 
      setTimeout(() => 
      { 
        resolve({ nome: "Daniel" }); 
      }, 1000); 
    }); 
  }
  buscarUsuario().then(usuario => 
  {
    console.log(usuario.nome); // Saída será Daniel
  });

Aqui:

  • A função retorna imediatamente
  • Mas o valor só chega quando estiver pronto

Caso 4 — Encadeamento sem Promise vira caos

Imagine múltiplas operações dependentes:

 
  buscarUsuario(function (usuario) 
  { 
    buscarPedidos(usuario.id, function (pedidos) 
    { 
      buscarDetalhes(pedidos[0], function (detalhes) 
      { 
        console.log(detalhes); 
      }); 
    }); 
  }); 
Callback hell: difícil de ler, manter e tratar erros.

Caso 5 — Promises organizam o fluxo


  buscarUsuario() .then(usuario => buscarPedidos(usuario.id)) .then(pedidos => buscarDetalhes(pedidos[0])) .then(detalhes => 
  { 
    console.log(detalhes); 
  }) .catch(erro => 
  { 
    console.log("Erro:", erro); 
  }); 

O fluxo agora é:

  • Linear
  • Legível
  • Com tratamento de erro centralizado

Caso 6 — async/await simplifica ainda mais

O mesmo código com async/await:

 
  async function executar() 
  { 
    try 
    { 
      const usuario = await buscarUsuario(); 
      const pedidos = await buscarPedidos(usuario.id); 
      const detalhes = await buscarDetalhes(pedidos[0]);
      console.log(detalhes);
    } catch (erro) 
    {
      console.log("Erro:", erro);
    }
  }
  executar();

Agora:

  • Fluxo parece síncrono
  • Mas continua assíncrono
  • Mais fácil de ler
  • Mais fácil de manter

Comparação honesta

  • Função simples → dados imediatos
  • Promise → dados futuros
  • async/await → Promises legíveis
Não use Promise quando função simples resolve. Use Promise quando o tempo importa.

Resumo da aula para nunca mais esquecer

  • Funções simples não esperam dados
  • Promises representam valores futuros
  • Promises resolvem problemas assíncronos reais
  • Use Promise quando o valor que você precisa ainda não está disponível AGORA, mas estará no futuro
  • async/await torna o código mais legível
  • Nada aqui é mágico — é controle de fluxo

Na próxima aula, vamos aplicar async/await em cenários reais com fetch, erros de rede e controle de fluxo completo.


HARDWARE

Entendendo o seu computador

O que há dentro do meu computador?

Existem alguns componentes fundamentais presentes dentro do seu computador e é muito importante que você conheça um pouco sobre eles, seja para argumentar com algum vendedor durante a compra de um novo PC ou para identificar alguma atitude desleal de algum técnico que esteja te passando um orçamento para reparo. Na seção Raio-X aqui do Contém Bits você pode conhecer e entender mais detalhadamente sobre cada componente, ou também pode clicar abaixo no componente que deseja, para conhecê-lo melhor.

  • Gabinetes

  • Placas-Mãe

  • Processadores

  • Memória

  • Fontes

  • Drives Ópticos

  • Discos Rígidos

  • SSD

  • Placas de Som

  • Placas de Vídeo

Você Sabia?

O primeiro computador a conseguir rodar o jogo Spacewar era o PDP-1, que custava 120 mil dólares e pertencia ao Massachusetts Institute of Technology. O jogo demorou 200 horas para ser desenvolvido, em 1962, e seu criador foi um cientista da computação chamado Steve Russel.


O título Space Invaders, lançado em 1980, fez tanto sucesso em todo o mundo que as pessoas compravam o console Atari apenas para poderem jogá-lo em casa. Saiba mais sobre este incrível título clicando aqui.


Apenas no ano de 1982, o clássico Pac Man vendeu mais de 400 mil máquinas de fliperama em todo o mundo e recebeu cerca de 7 bilhões de moedas nestas máquinas. Saiba mais.


Street Fighter 2, lançado para o Super Nintendo no início dos anos 90, foi o principal responsável pelo aumento nas vendas deste console. Graças ao sucesso do título nos Arcades e à perfeita adaptação ao console, muitos consumidores adquiriram o SNES para jogarem o título em casa. Saiba mais.


Até a primeira metade dos anos 90 era bastante comum que as trilhas sonoras dos games fossem criadas por mulheres e a responsável pelas músicas do clássico Street Fighter 2 foi Yoko Shimomura. Segundo ela, o ritmo "Tararirarin" da música tema do personagem Blanka, do Brasil, veio à sua cabeça enquanto ela estava no trem a caminho da Capcom.