{
“@context”: “https://schema.org”,
“@type”: “TechArticle”,
“headline”: “JavaScript assíncrono aguarda vs Promessa então: guia completo com exemplos reais”,
“description”: “Entenda a sintaxe async/await vs Promise.then, quando usar cada uma e as armadilhas comuns com exemplos de código que cobrem todos os padrões do mundo real.”,
“url”: “https://techpulsesite.com/javascript-async-await-vs-promise-then-c-pt/”,
“datePublished”: “2026-06-24T16:35:00+00:00”,
“dateModified”: “2026-06-29T04:14:50+00:00”,
“author”: {
“@type”: “Organization”,
“name”: “TechPulse Editorial Team”,
“url”: “https://techpulsesite.com”
},
“publisher”: {
“@type”: “Organization”,
“name”: “TechPulse”,
“url”: “https://techpulsesite.com”
},
“inLanguage”: “pt”
}
{
“@context”: “https://schema.org”,
“@type”: “TechArticle”,
“headline”: “JavaScript assíncrono aguarda vs Promessa então: guia completo com exemplos reais”,
“description”: “Entenda a sintaxe async/await vs Promise.then, quando usar cada uma e as armadilhas comuns com exemplos de código que cobrem todos os padrões do mundo real.”,
“url”: “https://techpulsesite.com/javascript-async-await-vs-promise-then-c-pt/”,
“datePublished”: “2026-06-24T16:35:00+00:00”,
“dateModified”: “2026-06-21T05:56:33+00:00”,
“author”: {
“@type”: “Organization”,
“name”: “TechPulse Editorial Team”,
“url”: “https://techpulsesite.com”
},
“publisher”: {
“@type”: “Organization”,
“name”: “TechPulse”,
“url”: “https://techpulsesite.com”
},
“inLanguage”: “pt”
}
JavaScriptassíncrono/aguarda ePromessa.então() ambos lidam com operações assíncronas — mas têm pontos fortes diferentes, perfis de legibilidade diferentes e padrões de tratamento de erros diferentes. Este guia aborda quando usar cada um com exemplos de código reais.
📋 Table of Contents
Que problema estamos resolvendo?
JavaScript é de thread único, mas lida com E/S de forma assíncrona. Sem uma maneira de “esperar” por operações assíncronas, você teria um inferno de retorno de chamada – funções aninhadas que são impossíveis de ler e manter. Promessas resolveram isso. async/await fez com que parecesse síncrono. Ambos são essenciais para entender.
Promessa.then() Sintaxe
// Basic promise chain
fetch('https://api.example.com/users')
.then(response => response.json())
.then(users => {
console.log(users);
return fetch(`/api/posts/${users[0].id}`);
})
.then(response => response.json())
.then(posts => console.log(posts))
.catch(error => console.error('Error:', error))
.finally(() => console.log('Done'));
As cadeias de promessas são legíveis para fluxos lineares simples. Cada.then() recebe o valor resolvido da etapa anterior.
Sintaxe assíncrona/aguardada
// Same logic with async/await
async function fetchUserPosts() {
try {
const userResponse = await fetch('https://api.example.com/users');
const users = await userResponse.json();
const postsResponse = await fetch(`/api/posts/${users[0].id}`);
const posts = await postsResponse.json();
console.log(posts);
} catch (error) {
console.error('Error:', error);
} finally {
console.log('Done');
}
}
fetchUserPosts();
async/await usa try/catch regular para erros e lê de cima para baixo como código síncrono – muito mais fácil de seguir para lógica complexa.
Lado a lado: o que é mais legível?
| Cenário | Promessa.então() | assíncrono/aguarda | Vencedor |
|---|---|---|---|
| Chamada assíncrona única | Limpar | Precisa de função assíncrona | Gravata |
| Operações sequenciais | A corrente fica longa | Lê naturalmente | assíncrono/aguarda |
| Operações paralelas | Promessa.all() natural | Precisa de Promise.all() também | Gravata |
| Tratamento de erros | .catch() fácil | tente/capture familiar | Gravata |
| Lógica condicional | Bagunçado por dentro .then() | If/else regular funciona | assíncrono/aguarda |
| Depuração | Rastreamento de pilha mais difícil | Melhores rastreamentos de pilha | assíncrono/aguarda |
Executando operações em paralelo
// WRONG: These run sequentially (slow)
async function slowFetch() {
const users = await fetchUsers(); // waits 500ms
const posts = await fetchPosts(); // then waits 500ms = 1000ms total
}
// RIGHT: Run in parallel with Promise.all
async function fastFetch() {
const [users, posts] = await Promise.all([
fetchUsers(), // both start at same time
fetchPosts() // total: ~500ms
]);
return { users, posts };
}
// Promise.then() approach for parallel:
Promise.all([fetchUsers(), fetchPosts()])
.then(([users, posts]) => ({ users, posts }))
.catch(console.error);
Padrões de tratamento de erros
// async/await: catch specific errors
async function getUser(id) {
try {
const response = await fetch(`/api/users/${id}`);
if (!response.ok) {
throw new Error(`HTTP error: ${response.status}`);
}
return await response.json();
} catch (error) {
if (error.message.includes('HTTP error: 404')) {
return null; // user not found
}
throw error; // rethrow unexpected errors
}
}
// Promise.then(): chain error catching
fetch(`/api/users/${id}`)
.then(response => {
if (!response.ok) throw new Error(`HTTP ${response.status}`);
return response.json();
})
.catch(error => {
if (error.message.includes('404')) return null;
throw error;
});
Erros comuns a serem evitados
- Esquecendo, aguarde:
const data = fetch(url)fornece um objeto Promise, não os dados. Sempreawaitisto. - aguarde dentro de .then(): Você não pode usar
awaitdentro de um retorno de chamada regular. Marque o retorno de chamada comoasync. - Serial em vez de paralelo: Sequencial
awaitchamadas quando as operações são independentes. UsarPromise.all(). - Esquecendo o tratamento de erros: Rejeições de promessas não detectadas travam os processos do Node.js e mostram erros vermelhos nos navegadores.
- Bloqueando o loop de eventos:
awaitsuspende a função, não o thread inteiro. Outro código ainda é executado.
Padrão do mundo real: classe de serviço API
class ApiService {
constructor(baseUrl) {
this.baseUrl = baseUrl;
}
async request(endpoint, options = {}) {
const response = await fetch(`${this.baseUrl}${endpoint}`, {
headers: { 'Content-Type': 'application/json', ...options.headers },
...options
});
if (!response.ok) throw new Error(`API Error: ${response.status}`);
return response.json();
}
async getUser(id) { return this.request(`/users/${id}`); }
async createPost(data) { return this.request('/posts', { method: 'POST', body: JSON.stringify(data) }); }
async updatePost(id, data) { return this.request(`/posts/${id}`, { method: 'PUT', body: JSON.stringify(data) }); }
}
Perguntas Frequentes
P: Async/await é apenas açúcar sintático em vez de Promises?
R: Sim. Sob o capô,async funções retornam Promessas eawait pausa a execução até que a promessa seja resolvida. Eles compilam da mesma forma em ambientes mais antigos.
P: Posso misturar async/await e .then() na mesma base de código?
R: Sim, e às vezes é apropriado. Uma função utilitária pode retornar uma promessa; um componente usa async/await para chamá-lo. Seja consistente dentro das funções.
P: O async/await funciona em todos os navegadores em 2026?
R: Sim. Todos os navegadores modernos suportam nativamente async/await. Nenhuma transpilação é necessária, a menos que você suporte o IE11 (o que não deveria ser feito em 2026).
P: E quanto aos geradores assíncronos para streaming?
A: for await...of com geradores assíncronos é excelente para lidar com respostas de streaming. Use-o com o ReadableStream da API Fetch para dados fragmentados.
P: O que devo ensinar aos iniciantes?
R: Ensine os conceitos do Promise primeiro para que eles entendam o que está acontecendo e depois ensine async/await como a sintaxe preferida. Compreender as promessas torna a depuração async/await muito mais fácil.
Conclusão
Em 2026,async/await é a escolha padrão para código novo — é mais legível, mais fácil de depurar e funciona naturalmente com try/catch. UsarPromise.then() quando o encadeamento é mais limpo (transformações simples) ou quando você precisa de um controle refinado comoPromise.race() ePromise.allSettled(). Ambas as habilidades são necessárias – dominar o JavaScript assíncrono não é negociável para qualquer desenvolvedor de JavaScript moderno.
🔗 Share this article
✍️ Leave a Comment