Aula 2

JavaScript Avançado

Callback e Programação síncrona e assíncrona

Função normal e callback

Uma função normal apenas executa uma tarefa e retorna o resultado. Já uma função de callback é passada como argumento para outra função e é chamada quando a tarefa terminar.

Exemplo 1 (função normal)

function soma(a, b) {
  return a + b;
}
console.log(soma(5, 3));
Exemplo 2 (callback simples)

function cumprimentar(nome, callback) {
  console.log("Olá, " + nome);
  callback();
}

cumprimentar("Maria", () => {
  console.log("Callback executado!");
});
Exemplo 3 (simulando servidor com callback)

function buscarDados(callback) {
  setTimeout(() => {
    callback("📦 Dados carregados!");
  }, 2000);
}

buscarDados((resultado) => {
  console.log(resultado);
});

Programação síncrona e assíncrona

Na programação síncrona, as instruções são executadas uma após a outra. Se uma linha demora muito (como acessar um servidor), o programa inteiro fica "travado".

Na programação assíncrona, o JavaScript não espera a tarefa lenta terminar. Ele continua executando o resto do código e, quando a tarefa acaba, chama uma função de retorno.

Exemplo 1 (síncrono)

console.log("Início");
for (let i = 0; i < 3; i++) {
  console.log("Processando", i);
}
console.log("Fim");
Exemplo 2 (assíncrono com setTimeout)

console.log("Início");
setTimeout(() => {
  console.log("Processo demorado terminou!");
}, 2000);
console.log("Fim");
Exemplo 3 (requisição simulada)

console.log("Buscando dados...");

setTimeout(() => {
  console.log("✅ Dados recebidos do servidor!");
}, 3000);

console.log("Você pode continuar usando o app...");

Async/Await

async e await são formas mais simples de lidar com Promises. O async transforma a função em assíncrona, retornando uma Promise. O await faz o código "esperar" pela resposta da Promise.

Exemplo 1 (async cria promise automaticamente)

     async function exemplo() {
       return "🚀 Retornado dentro de uma async!";
     }
     exemplo().then(console.log);
     
Exemplo 2 (usando await)

     function esperar(ms) {
       return new Promise(resolve => setTimeout(resolve, ms));
     }
     
     async function executar() {
       console.log("Início");
       await esperar(2000);
       console.log("Fim após 2 segundos");
     }
     executar();
     
Exemplo 3 (tratamento de erros com try/catch)

     async function buscarDados() {
       try {
         throw new Error("Falha na conexão!");
       } catch (erro) {
         console.log("⚠️ Erro capturado:", erro.message);
       }
     }
     buscarDados();