DEV Community

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

Posted on • Edited on

6

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

SurveyJS custom survey software

Build Your Own Forms without Manual Coding

SurveyJS UI libraries let you build a JSON-based form management system that integrates with any backend, giving you full control over your data with no user limits. Includes support for custom question types, skip logic, an integrated CSS editor, PDF export, real-time analytics, and more.

Learn more

Top comments (0)

SurveyJS custom survey software

JavaScript Form Builder UI Component

Generate dynamic JSON-driven forms directly in your JavaScript app (Angular, React, Vue.js, jQuery) with a fully customizable drag-and-drop form builder. Easily integrate with any backend system and retain full ownership over your data, with no user or form submission limits.

Learn more

AWS GenAI LIVE!

GenAI LIVE! is a dynamic live-streamed show exploring how AWS and our partners are helping organizations unlock real value with generative AI.

Tune in to the full event

DEV is partnering to bring live events to the community. Join us or dismiss this billboard if you're not interested. ❤️