1
resposta

Dúvida sobre meu código.

Fiz a função apresentada na aula da seguinte forma:

async function processaTexto(caminho) {

    if (fs.lstatSync(caminho).isFile()) {
        const resposta = await getFile(caminho);
        console.log(resposta);
    }
    else if (fs.lstatSync(caminho).isDirectory()) {
        const arquivos = await fs.promises.readdir(caminho);
        
        arquivos.forEach(arquivo => processaTexto(`${caminho}/${arquivo}`));
    }
}

No lugar de criar uma nova função assincrona no forEach, para cada um dos elementos eu chamo a função novamente e eles vão caindo no primeiro if. A minha dúvida é se fazendo dessa forma a função continua assíncrona ou se isso prejudica de alguma forma o funcionamento dela.

1 resposta

Oii Carlos, tudo bem? Espero que sim!

Sobre sua dúvida na utilização recursiva da função processaTexto para tratar diretórios e arquivos de forma assíncrona, você fez uma escolha interessante ao chamar a função recursivamente dentro do forEach. Isso mantém a natureza assíncrona da função, já que cada chamada recursiva é uma nova instância da função processaTexto que pode operar de forma independente.

No entanto, há um detalhe importante a considerar: o uso de forEach com funções assíncronas pode não funcionar como esperado, porque forEach não espera que as promessas sejam resolvidas antes de continuar para a próxima iteração. Isso significa que, embora as operações assíncronas sejam iniciadas corretamente, o forEach não aguarda sua conclusão antes de terminar. Isso pode levar a comportamentos não sequenciais que podem ser problemáticos, dependendo do que você precisa fazer após processar todos os arquivos.

Uma alternativa seria usar um loop for...of, que suporta await dentro dele, garantindo que cada arquivo seja processado completamente antes de passar para o próximo. Aqui está como você poderia modificar sua função para usar for...of:

async function processaTexto(caminho) {
    if (fs.lstatSync(caminho).isFile()) {
        const resposta = await getFile(caminho);
        console.log(resposta);
    }
    else if (fs.lstatSync(caminho).isDirectory()) {
        const arquivos = await fs.promises.readdir(caminho);
        
        for (const arquivo of arquivos) {
            await processaTexto(`${caminho}/${arquivo}`);
        }
    }
}

Com essa abordagem, cada arquivo em um diretório será completamente processado antes de iniciar o processamento do próximo arquivo, o que pode ser mais adequado dependendo do contexto de uso da função.

Espero ter ajudado!

Caso tenha dúvidas, fico à disposição.

Abraços e bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software