1
resposta

[Dúvida] function pegaArquivo

Ao executar duas vezes a mesma function pegaArquivo, uma com o caminho correto e a outra com um caminho inexistente ou errado o programa apresenta apenas a saída de erro, eu não entendi a causa desse problema, não deveria executar duas vezes a function conforme esta o exemplo da aula?

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta

EDIT:

Fiz mais alguns testes e parece não ser relacionado exatamente à versão do Node.js e sim à sincronicidade/assincronicidade das funções e à forma como elas estão sendo executadas a nível de sistema operacional.

Como a função pegaArquivo() trabalha com promessas (ou seja, de forma assíncrona), ao executarmos a mesma função duas vezes, uma em seguida da outra, existe a possibilidade de que os retornos não ocorram na mesma ordem de chamada. Por exemplo, a função que recebe o parâmetro correto poderia "demorar" um pouco mais para retornar o texto do que o tempo que a função que recebe o parâmetro errado levaria retornar o erro (ou, como estamos usando throw, "lançar" o erro).

Um dos pontos aqui é justamente o throw. Como este recurso interrompe a execução do programa, se a função "incorreta" executar antes, o throw encerra o programa antes que a função "correta" retorne o texto, e por isso somente o erro é exibido no terminal. Caso queira, pode fazer o teste com a seguinte alteração na função pegaArquivo():

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);
    console.log('aqui deu erro!');
  }
}

Ao substituirmos o throw por um console.log() (que não interrompe a execução do programa) tudo funciona normalmente.

Outro teste que podemos fazer é colocar a segunda chamada da função dentro de uma função setInterval(), que vai "aguardar" 5 segundos antes de executar:

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);
  }
}

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

Com essa pausa, damos um tempinho para que a função "correta" retorne o texto no terminal antes da execução da função "incorreta".

Faça o teste ;) Bons estudos!


Olá!

Estamos tentando aqui reproduzir o seu erro, pois está aparecendo de forma intermitente entre minors da versão 18 do Node.js - por exemplo, o erro está ocorrendo no Linux na versão 18.7.0 e no Windows está ocorrendo na versão 18.9.1. Está me pam recendo um bug de interpretação interna do próprio Node.js. Como a 18 ainda não entrou como LTS (isso vai acontecer em alguns dias) é bem provável que seja corrigido com rapidez.

Vamos continuar investigando e, se ainda for necessário, fazemos um adendo no conteúdo após o lançamento da v18 como LTS.

Obrigada por avisar e bons estudos ;)