Quando vc usa o await
vc transforma sua função assíncrona em uma função síncrona.
Ou seja, o await
faz o programa esperar a resolução da Promise antes de continuar.
Ajustei os códigos que vc mostrou e preparei 2 exemplos para demonstrar a diferença.
EXEMPLO 1
function minhaFuncao() {
return new Promise((resolve) => setTimeout(() => resolve("Hello"), 2000));
}
console.log(new Date(), "Início");
minhaFuncao()
.then((result) => console.log(new Date(), result))
.catch((error) => console.error(new Date(), error));
console.log(new Date(), "Fim");
O resultado será parecido com este:
2024-04-07T14:22:29.815Z Início
2024-04-07T14:22:29.823Z Fim
2024-04-07T14:22:31.826Z Hello
Note que "Início" e "Fim" são impresso um logo após o outro enquanto que "Hello" só aparece 2 segundos depois.
É isso que a Promisse faz, executa uma tarefa fora do fluxo normal do programa.
EXEMPLO 2
function minhaFuncao() {
return new Promise((resolve) => setTimeout(() => resolve("Hello"), 2000));
}
console.log(new Date(), "Início");
const resultado = await minhaFuncao();
console.log(new Date(), resultado);
console.log(new Date(), "Fim");
O resultado será parecido com este:
2024-04-07T14:28:53.733Z Início
2024-04-07T14:28:55.743Z Hello
2024-04-07T14:28:55.743Z Fim
Aqui "Início" é impresso e 2 segundos depois vem "Hello" e por último "Fim".
Percebeu o que eu disse antes sobre o await
esperar a resolução da Promise antes de continuar o programa?
E sobre o try/catch
não tem segredo. É com essa duplinha que tratamos exceções no JavaScript.
Se vc estiver usando Promise, vc vai usar then/catch
, mas quando vc usa o await
, a Promise passa a se comportar como uma função síncrona e vc precisa usar try/catch
para tratar possíveis erros.
Sobre quando vc deve usar cada uma, acredito que o ideal é modelar o seu programa todo de forma assíncrona pra tirar total proveito das Promise, mas pode haver situações em que isso não é possível, ou então vc sabe que a tarefa que a Promise vai realizar é tão simples e rápida que vale a pena esperar.