JavaScript — Modulo 3
Assincronismo
Lista de Exercicios
Bloco 1 — O que e Assincronismo
JavaScript executa o codigo linha por linha, mas algumas tarefas demoram — como ler um arquivo,
consultar um banco de dados ou fazer uma requisicao HTTP. Em vez de travar e esperar, o JS
continua executando o restante do codigo e avisa quando a tarefa terminou. Isso e o assincronismo.
Entender esse comportamento e essencial no [Link], onde quase tudo — leitura de arquivos, rotas,
banco de dados — e assincrono.
Exemplo:
[Link]('1 - inicio');
setTimeout(() => {
[Link]('2 - dentro do setTimeout');
}, 1000);
[Link]('3 - fim');
// Saida:
// 1 - inicio
// 3 - fim
// 2 - dentro do setTimeout (apos 1 segundo)
1. O que sera exibido no console e em qual ordem? Explique o motivo:
[Link]('A');
setTimeout(() => [Link]('B'), 0);
[Link]('C');
Resposta:
2. Escreva um codigo com tres [Link] e um setTimeout no meio. Antes de rodar,
tente prever a ordem de saida e depois confirme executando.
Resposta:
3. Explique com suas palavras a diferenca entre codigo sincrono e assincrono. Crie um
exemplo de cada.
Resposta:
4. Por que o [Link] usa assincronismo? Escreva um paragrafo explicando o beneficio
disso para um servidor que recebe muitas requisicoes ao mesmo tempo.
Resposta:
Bloco 2 — Callbacks
Callbacks foram a primeira forma de lidar com assincronismo em JavaScript. Uma funcao callback e
passada como argumento e executada quando a operacao assincrona termina. O padrao mais
comum no [Link] e o error-first callback: o primeiro parametro e sempre o erro (null se nao houver) e
o segundo e o resultado. Apesar de funcionarem bem, callbacks podem gerar o chamado 'callback
hell' quando aninhados demais.
Exemplo:
// Padrao error-first callback (padrao do [Link])
function buscarUsuario(id, callback) {
if (id <= 0) {
callback('ID invalido', null);
} else {
callback(null, { id, nome: 'Ana' });
}
}
buscarUsuario(1, (erro, usuario) => {
if (erro) {
[Link]('Erro:', erro);
} else {
[Link]('Usuario:', [Link]);
}
});
5. Crie uma funcao processarPedido(pedido, callback) que simule o processamento de
um pedido. Se o pedido estiver vazio, chame o callback com um erro. Caso contrario,
chame com sucesso.
Resposta:
6. Crie uma funcao autenticar(usuario, senha, callback) que verifique se usuario e
'admin' e senha e '1234'. Use o padrao error-first callback.
Resposta:
7. O que e callback hell? Escreva um exemplo com pelo menos tres callbacks aninhados
e explique por que isso e um problema.
Resposta:
8. Crie uma funcao lerArquivoFalso(nome, callback) que simule a leitura de um arquivo
usando setTimeout de 1 segundo. Chame o callback com um conteudo ficticio apos o
tempo.
Resposta:
9. Refatore o exercicio anterior para tambem tratar o caso de erro: se o nome do arquivo
estiver vazio, o callback deve receber um erro descritivo.
Resposta:
Bloco 3 — Promises
Promises (promessas) foram criadas para resolver o problema do callback hell, tornando o codigo
assincrono mais legivel e estruturado. Uma Promise representa uma operacao que ainda nao
terminou, mas vai terminar no futuro — com sucesso (resolve) ou com falha (reject). Usamos .then()
para tratar o sucesso, .catch() para tratar erros e .finally() para executar algo independente do
resultado. As Promises sao a base do async/await, que veremos no proximo bloco.
Exemplo:
function buscarDados(id) {
return new Promise((resolve, reject) => {
if (id > 0) {
resolve({ id, nome: 'Ana' });
} else {
reject('ID invalido');
}
});
}
buscarDados(1)
.then(usuario => [Link]('Encontrado:', [Link]))
.catch(erro => [Link]('Erro:', erro))
.finally(() => [Link]('Operacao finalizada'));
10. Crie uma Promise que resolve com a mensagem 'Conexao estabelecida' apos 2
segundos usando setTimeout. Use .then() para exibir o resultado.
Resposta:
11. Crie uma funcao verificarEstoque(quantidade) que retorne uma Promise. Se a
quantidade for maior que 0, resolve com 'Produto disponivel'. Caso contrario, rejeita com
'Sem estoque'.
Resposta:
12. Use .catch() para tratar o erro do exercicio anterior quando a quantidade for 0.
Adicione tambem um .finally() que exiba 'Consulta finalizada' sempre ao final.
Resposta:
13. Crie duas Promises que resolvem em tempos diferentes (use setTimeout). Use
[Link] para esperar as duas terminarem e exibir os resultados juntos.
Resposta:
14. Qual a diferenca entre [Link] e [Link]? Escreva um exemplo de cada e
explique quando usar um ou outro.
Resposta:
15. Converta a funcao autenticar do Bloco 2 (que usava callback) para retornar uma
Promise.
Resposta:
Bloco 4 — Async e Await
Async/Await e a forma mais moderna e legivel de trabalhar com assincronismo em JavaScript. Uma
funcao declarada com async sempre retorna uma Promise. Dentro dela, o await pausa a execucao ate
que a Promise seja resolvida, sem bloquear o restante do programa. O tratamento de erros e feito
com try/catch, igual ao codigo sincrono. No [Link] com Express, voce vai usar async/await em
praticamente todas as rotas que acessam banco de dados ou APIs externas.
Exemplo:
function esperar(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function buscarPedido(id) {
try {
[Link]('Buscando pedido...');
await esperar(1000);
if (id <= 0) throw new Error('ID invalido');
return { id, status: 'aprovado' };
} catch (erro) {
[Link]('Erro:', [Link]);
}
}
buscarPedido(5).then(p => [Link](p));
16. Crie uma funcao async chamada saudar que aguarde 1 segundo (use setTimeout
dentro de uma Promise) e depois retorne 'Ola, Mundo!'. Chame a funcao e exiba o
resultado com .then().
Resposta:
17. Reescreva a funcao verificarEstoque do Bloco 3 usando async/await em vez de
.then() e .catch().
Resposta:
18. Crie uma funcao async processarPagamento(valor) que use try/catch. Se o valor for
menor ou igual a 0, lance um erro com throw. Caso contrario, retorne 'Pagamento de
R$[valor] aprovado'.
Resposta:
19. Crie duas funcoes async que simulam buscar dados de fontes diferentes (use
setTimeout). Chame as duas com await em sequencia e depois com [Link].
Compare os comportamentos.
Resposta:
20. O que acontece se voce usar await fora de uma funcao async? Teste e explique o
erro.
Resposta:
21. Simule uma rota do Express: crie uma funcao async rotaBuscarUsuario(id) que use
try/catch, aguarde uma Promise que busca o usuario, e retorne um objeto com status
200 e os dados — ou status 404 em caso de erro.
Resposta:
Pratique cada exercicio no terminal com: node [Link]