Async/Await
O que fazer para evitar o callback hell e o chaining de promises?
No capítulo de promises, foi mostrado como uma promise funciona:
const fsPromises= require('fsPromises')
// Ler o conteudo do arquivo `chave-privada.txt`
const promessaDaLeitura = fsPromises.readFile('./chave-privada.txt');
promessaDaLeitura.then((data) => {
// Quando a leitura terminar, rodar essa função aqui
console.log(data); // a chave privada
});
// Tanto faz chamar o then direto da função ou depois (guardando o retorno da função em uma variavel)
// fsPromises.readFile('./chave-privada.txt').then((data) => {
// console.log(data);
// })
No exemplo acima, só há uma promise (marcado pelo ".then"), mas e se precisássemos utilizar a variável data em uma outra próxima promise?
Isso criaria um encadeamento de promises uma dentro da outra, e, no final, teríamos infinitas promises uma dentro da outra.
Algo como:
f1.then((data1) => {
f2(data1).then((data2) => {
f3.then((data3) => {
console.log(data3)
//podendo continuar indefinidamente
})
})
})
Para o código acima, dá-se o nome de callback hell.
E como podemos evitar isso? Usando async/await!
O que acontece com uma função marcada com async/await é que ela espera a promise ser terminada antes de continuar o código, exatamente como o .then, mas sem entrar nos problemas de chaining.
A única coisa que precisamos fazer é o seguinte:
const functionOne = async () => {
const resultado = await functionTwo();
const resultado2 = await functionThree(resultado)
console.log(resultado2)
}
Nesse exemplo, a função functionOne foi marcada para ser uma função "async" (assíncrona), e, dessa forma, qualquer função chamada com o "await" dentro dela irá fazer com que a functionOne espere (tradução de await) até que essa outra função (por exemplo, a functionTwo) termine sua operação assíncrona e retorne seu valor final para que a função-pai (functionOne) continue a sua execução.
Então se, por exemplo, a functionTwo for uma função que lê um determinado arquivo, a functionOne irá ficar parada naquela linha, esperando até que a functionTwo termine a sua execução e retorne o que tiver de retornar, antes de prosseguir para a próxima linha de código.
Last updated
Was this helpful?