Operações assíncronas baseadas em Promises podem ser escirtas de forma tradciional. Exemplo:
function esperar(tempo) {
return new Promise((resolver) => {
setTimeout(() => {
console.log('-- dentro do setTimeout --', tempo);
resolver(tempo);
}, tempo);
});
}
function executar(entrada, tempo) {
console.log('início');
esperar(tempo).then((resultado) => {
console.log(entrada, 'valor de entrada', resultado, 'resultado');
console.log('fim');
});
}
executar('parâmetro', 1500);
Essa mesma lógica pode ser simplificada com async/await:
async function esperar(tempo) {
await new Promise((resolver) => {
setTimeout(() => {
console.log('-- dentro do setTimeout --', tempo);
resolver(tempo);
}, tempo);
});
}
async function executar(entrada, tempo) {
console.log('início');
const resultado = await esperar(tempo);
console.log(entrada, 'valor de entrada', resultado, 'resultado');
console.log('fim');
}
executar('parâmetro', 1500);
Quando a Promise preecisa entrar no estado de rejeição (reject), a versão tradicional utiliza catch:
function esperar(tempo) {
return new Promise((resolver, rejeitar) => {
const condicao = false;
setTimeout(() => {
console.log('-- dentro do setTimeout --', tempo);
if (condicao) {
resolver();
} else {
rejeitar('Erro: algo deu errado');
}
}, tempo);
});
}
function executar(entrada, tempo) {
console.log('início');
esperar(tempo)
.then(() => {
console.log(entrada, 'valor de entrada');
console.log('fim');
})
.catch((erro) => {
console.log(erro);
});
}
executar('parâmetro', 1500);
Com async/await, é possível capturar rejeições usando try/catch ou encadeando .catch() ao await:
async function esperar(tempo) {
await new Promise((resolver, rejeitar) => {
const condicao = false;
setTimeout(() => {
console.log('-- dentro do setTimeout --', tempo);
if (condicao) {
resolver();
} else {
rejeitar('Erro: algo deu errado');
}
}, tempo);
});
}
// Usando try/catch:
async function executar(entrada, tempo) {
try {
console.log('início');
await esperar(tempo);
console.log(entrada, 'valor de entrada');
console.log('fim');
} catch (erro) {
console.log(erro);
}
}
// Ou capturando diretamente com .catch():
async function executar2(entrada, tempo) {
console.log('início');
await esperar(tempo).catch((erro) => console.log(erro));
console.log(entrada, 'valor de entrada');
console.log('fim');
}
executar('parâmetro', 1500);
Saída esperada:
início
-- dentro do setTimeout --, 1500
Erro: algo deu errado