DEV Community

Cover image for JavaScript: Porque usar Promise.all?
Cristian Magalhães
Cristian Magalhães

Posted on • Edited on

JavaScript: Porque usar Promise.all?

Eae gente bonita, beleza?

Dessa vez eu vim falar sobre um comando bem útil para o nosso dia a dia e principalmente quando precisamos otimizar o nosso código.

O comando em questão é o Promise.all. Ele basicamente serve para executar diversas promises de forma paralela. É importante você entender o conceito de promises no JavaScript para ler esse texto. Caso não entenda eu tenho um texto falando sobre isso também, JavaScript: O que é uma Promise?

Exemplo

Vamos considerar o código abaixo. Nesse código eu tenho uma função chamada funcaoPromise que recebo um parâmetro que são os milissegundos pro setTimeOut. Todas aqui levam 5 segundos para serem executadas. Se eu chamar 3 funções dessas seguidas elas levam ao todo 15 segundos para serem executadas

 async function funcaoPromise(milissegundos) { return new Promise((resolve, reject) => { return setTimeout(() => resolve(console.log(`Executado após ${milissegundos} milissegundos`)), milissegundos) }) } async function main() { console.time() await funcaoPromise(5000) await funcaoPromise(5000) await funcaoPromise(5000) console.timeEnd() }; main(); 
Enter fullscreen mode Exit fullscreen mode

e o retorno no console é

Executado após 5000 milissegundos Executado após 5000 milissegundos Executado após 5000 milissegundos default: 15.015s 
Enter fullscreen mode Exit fullscreen mode

Porém, e se eu quisesse que as 3 fossem executadas "ao mesmo tempo", assim a execução do código seria mais rápido e ao invés de gastar 15s eu gastar 5s, pois todas levam o mesmo tempo para serem executadas. E é nessa hora que entra o nosso herói o Promise.all

Bom vamos refatorar esse código e usar o Promise.all. Após a refatoração o código vai ficar exatamente dessa forma:

 async function funcaoPromise(milissegundos) { return new Promise((resolve, reject) => { return setTimeout(() => resolve(console.log(`Executado após ${milissegundos} milissegundos`)), milissegundos) }) } async function main() { console.time() await Promise.all([ funcaoPromise(5000), funcaoPromise(5000), funcaoPromise(5000) ]); console.timeEnd() }; main(); 
Enter fullscreen mode Exit fullscreen mode

Como funciona?

Bom basicamente nós passamos uma array para o Promise.all como parâmetro e dentro desse array passamos as promises que devem ser executadas em paralelo e colocamos um await na frente para esperar pela execução de todas.

Mas e se a minha promise tiver um retorno?

Nesse caso nós podemos desestruturar o retorno do Promise.all pois ele retorna um array com o resultado da função na mesma posição em que ela foi passada.

 const [resultado1, resultado2, resultado3] = await Promise.all([ funcaoPromise(5000), funcaoPromise(5000), funcaoPromise(5000) ]); ``` E após isso tudo se executarmos o código usando `Promise.all` teremos o seguinte resultado: ```javascript Executado após 5000 milissegundos Executado após 5000 milissegundos Executado após 5000 milissegundos default: 5.008s ``` O código foi executado em 5 segundos apenas. Se chegou até aqui, me segue la nas [redes vizinhas.] (https://bento.me/cmsdev) <img src="https://media.giphy.com/media/uWlpPGquhGZNFzY90z/giphy.gif" /> 
Enter fullscreen mode Exit fullscreen mode

Top comments (0)