Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Ordem de chamadas da função

import fs from 'fs';
import chalk from 'chalk';

function trataErro(erro) {
    throw new Error(chalk.red(erro.code, 'Arquivo não encontrado. Verifique se o arquivo existe ou se o caminho/diretório esta correto.'));
}

//async/await:

async function pegaArquivo(caminhoDoArquivo) {

    try {        
        const encoding = 'UTF-8';
        const texto = await fs.promises.readFile(caminhoDoArquivo, encoding)
        console.log(chalk.green(texto))
    } catch (erro) {
        trataErro(erro);
    } finally {
        console.log(chalk.yellow('Operação Concluída !'));
    }

}

pegaArquivo('./arquivos/texto.md');
setInterval(() => pegaArquivo('./arquivos/'), 5000);

Tenho a seguinte dúvida, sempre que rodo esse código, a impressão no terminal é a resposta do try, seguidas pelas duas respostas do finally e por fim a do catch, como mostrado abaixo:

PS C:\Users\Leonardo002\Desktop\Alura\Programação\JavaScript-Back-End\Node.js - Criando a Primeira Biblioteca\2708-node-lib-md-arquivos-iniciais> node index.js
A interface File provê informações sobre arquivos e permite ao JavaScript  a acessar seu conteúdo.

São geralmente recuperados a partir de um objeto [FileList](https://developer.mozilla.org/pt-BR/docs/Web/API/FileList) que é retornado como resultado da seleção, pelo usuário, de arquivos através do elemento [<input>](https://developer.mozilla.org/pt-BR/docs/Web/HTML/Element/Input), a partir do objeto [DataTransfer](https://developer.mozilla.org/pt-BR/docs/Web/API/DataTransfer) utilizado em operações de arrastar e soltar, ou a partir da API `mozGetAsFile()` em um [HTMLCanvasElement](https://developer.mozilla.org/pt-BR/docs/Web/API/HTMLCanvasElement). Em Gecko, códigos com privilégiios podem criar objetos File representando qualquer arquivo local sem a intereção do usuário (veja [Implementation notes](https://developer.mozilla.org/pt-BR/docs/Web/API/File#implementation_notes) para mais informações.).

[Teste de retorno 400](https://httpstat.us/404).
[gatinho salsicha](http://gatinhosalsicha.com.br/)
Operação Concluída !
Operação Concluída !
file:///C:/Users/Leonardo002/Desktop/Alura/Programa%C3%A7%C3%A3o/JavaScript-Back-End/Node.js%20-%20Criando%20a%20Primeira%20Biblioteca/2708-node-lib-md-arquivos-iniciais/index.js:5
    throw new Error(chalk.red(erro.code, 'Arquivo não encontrado. Verifique se o arquivo existe ou se o caminho/diretório esta correto.'));
          ^

Error: EISDIR Arquivo não encontrado. Verifique se o arquivo existe ou se o caminho/diretório esta correto.
    at trataErro (file:///C:/Users/Leonardo002/Desktop/Alura/Programa%C3%A7%C3%A3o/JavaScript-Back-End/Node.js%20-%20Criando%20a%20Primeira%20Biblioteca/2708-node-lib-md-arquivos-iniciais/index.js:5:11)
    at pegaArquivo (file:///C:/Users/Leonardo002/Desktop/Alura/Programa%C3%A7%C3%A3o/JavaScript-Back-End/Node.js%20-%20Criando%20a%20Primeira%20Biblioteca/2708-node-lib-md-arquivos-iniciais/index.js:17:9)

Node.js v20.9.0
PS C:\Users\Leonardo002\Desktop\Alura\Programação\JavaScript-Back-End\Node.js - Criando a Primeira Biblioteca\2708-node-lib-md-arquivos-iniciais>

Mesmo utilizando o setIterval(conforma foi sugerido em outros exemplos que dei uma olhada), a ordem se mantem a mesma. Por que o finally se mantem sendo executado antes do catch e como eu posso fazer para que, nas duas chamadas, o resultado dele venha por ultimo? Exemplo: Primeira chamada - resultado do Try e logo abaixo resultado do finally; Segunda chama - resultado do catch e logo abaixo resultado do finally.

1 resposta
solução!

Olá, Leonardo!

A ordem dos blocos try, catch e finally é sempre a mesma, ou seja, o código dentro do bloco try é executado primeiro, se houver algum erro, o bloco catch é executado e, independentemente do que aconteceu antes, o bloco finally é sempre executado no final.

No seu caso, o que está acontecendo é que você está chamando a função pegaArquivo duas vezes quase simultaneamente. A primeira chamada é feita diretamente e a segunda é feita após um intervalo de 5 segundos.

A primeira chamada é bem-sucedida, então o bloco try é executado, seguido pelo bloco finally. No entanto, antes que a segunda chamada possa começar (ou seja, antes que o intervalo de 5 segundos termine), o bloco finally da primeira chamada é executado.

A segunda chamada falha, então o bloco catch é executado, seguido pelo bloco finally. Mas, como o bloco finally da primeira chamada já foi executado, parece que o bloco finally está sendo executado antes do bloco catch.

Para resolver isso, você pode aumentar o intervalo de tempo na função setInterval para garantir que a primeira chamada seja concluída antes da segunda começar. Por exemplo, você pode tentar mudar de 5 segundos para 10 segundos.

Aqui está o código modificado:

pegaArquivo('./arquivos/texto.md');
setInterval(() => pegaArquivo('./arquivos/'), 10000);

Espero ter ajudado 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