- Programação

Utilizando Promises e async/await em loops no JavaScript

Ao trabalhar com JavaScript, um dos desafios mais comuns é lidar com operações assíncronas dentro de loops. O uso de Promises e das palavras-chave async/await pode facilitar bastante o controle da execução assíncrona, evitando callbacks complexos e problemas de sincronização. Neste artigo, vamos explorar como usar essas ferramentas para gerenciar loops de maneira eficiente e clara.

O que são Promises e async/await?

Promessas (Promises) são uma maneira de lidar com operações assíncronas no JavaScript. Uma Promise representa o valor de uma operação que pode ser resolvida no futuro, ou rejeitada se algo der errado.

A palavra-chave async é usada para declarar funções assíncronas, e await permite esperar pela resolução de uma Promise dentro dessas funções, fazendo o código parecer sincrônico, sem bloquear o restante da execução.

Como usar Promises e async/await em loops

Quando estamos iterando sobre uma coleção de dados (como arrays), e cada iteração envolve uma operação assíncrona, podemos usar o async/await para garantir que cada Promise seja resolvida antes de passar para a próxima iteração.

Aqui está um exemplo básico de como usar Promises e async/await dentro de um loop for:

async function processArray(arr) {
    for (let i = 0; i < arr.length; i++) {
        await someAsyncOperation(arr[i]);
        console.log(`Item ${arr[i]} processado`);
    }
}

async function someAsyncOperation(item) {
    return new Promise(resolve => setTimeout(() => resolve(item), 1000));
}

processArray([1, 2, 3, 4]);

Como evitar problemas de concorrência

Quando usamos await dentro de loops, ele garante que a iteração aguarde a conclusão da operação assíncrona antes de passar para o próximo item. No entanto, se você não usar await corretamente, pode acabar com várias Promises sendo executadas em paralelo, o que pode não ser o comportamento desejado.

Utilizando Promise.all para paralelizar operações

Se você quiser que todas as operações assíncronas ocorram em paralelo, sem esperar que cada uma termine antes de iniciar a próxima, você pode usar Promise.all. Isso é útil quando não importa a ordem em que as Promises são resolvidas:

async function processArrayInParallel(arr) {
    const promises = arr.map(item => someAsyncOperation(item));
    const results = await Promise.all(promises);
    console.log('Todos os itens processados', results);
}

processArrayInParallel([1, 2, 3, 4]);

Considerações de desempenho

O uso de await dentro de loops pode impactar o desempenho se não for bem gerido, especialmente em loops grandes ou quando as operações assíncronas são rápidas. Nesse caso, a paralelização com Promise.all pode ser uma alternativa mais eficiente.

Conclusão

Combinar Promises com async/await dentro de loops no JavaScript pode melhorar a legibilidade do código e tornar o gerenciamento de operações assíncronas muito mais fácil. Ao entender quando e como usar essas ferramentas, você poderá controlar a execução do seu código de forma eficiente, seja aguardando a resolução de cada Promise ou paralelizando as operações quando necessário.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *