Nem todos os problemas consistem em entrada de dados fornecidas sequencialmente pelos usuários.
Existem muitos problemas em que os dados a serem processados encontram-se armazenados em arquivos (de texto, por exemplo).
A linguagem Javascript fornece dois modos de leitura de dados em arquivo: modo SÍNCRONO e modo ASSÍNCRONO.
No modo síncrono, o arquivo é acessado e o programa interrompe seu processamento enquanto os dados estão sendo lidos. Esse é o modo típico de um diálogo por ligação telefônica convencional: enquanto um fala, o outro ouve e vice-versa.
Para leitura síncrona, Javascript disponibiliza a função pre-definida readFileSync
. Essa função possui o caminho do arquivo como parâmetro de entrada e retorna o seu conteúdo.
[EXEMPLO] Programa que lê o conteúdo de um arquivo de texto, exibe esse conteúdo no terminal e, A SEGUIR, realiza a próxima operação programada (no exemplo, a soma de dois valores quaisquer).
//Bibliotecas para ler arquivos const fs = require('fs') const path = require('path') //Especifica o nome do arquivo const caminho = path.join(__dirname, 'dados.txt') //Fica esperando a leitura do arquivo para avançar no código. console.log('=== INICIO da leitura do arquivo...') const conteudo = fs.readFileSync(caminho) console.log(conteudo.toString()) console.log('=== FIM da leitura.\n') console.log('=== INICIO de uma outra operação qualquer...') const exec = (fn, a, b) => fn(a, b) const somarNoTerminal = (x, y) => console.log(`Resultado: ${x + y}.`) exec(somarNoTerminal, 56, 38) console.log('=== FIM da outra operação.\n')
Como visto acima, a execução de uma função precisa esperar o término da anterior. Mas em alguns casos, podemos ganhar tempo de execução realizando uma tarefa de maneira assíncrona, como acontece em um bate papo por mensageiros instantâneos (ex: Whatsapp).
Para leitura assíncrona, Javascript disponibiliza a função pre-definida readFile
. Além do caminho do arquivo, essa função exige um segundo parâmetro de entrada: uma função responsável por realizar o processamento desejado assim que o conteúdo do arquivo tiver sido completamente lido. Ou seja, é como se mandássemos executar alguma coisa, mas essa coisa só será executada em um momento futuro. Existe uma nomenclatura especial para essa função que será executada em um momento futuro: CALLBACK.
[EXEMPLO] Programa que lê o conteúdo de um arquivo de texto no modo assíncrono, com callback.
//Bibliotecas Node para ler arquivos const fs = require('fs') const path = require('path') const caminho = path.join(__dirname, 'dados.txt') //Callback const exibirConteudo = (_, conteudo) => console.log(conteudo.toString()) console.log('=== INICIO da leitura do arquivo...') fs.readFile(caminho, exibirConteudo) console.log('=== FIM da leitura.\n') console.log('=== INICIO de uma outra operação qualquer...') const exec = (fn, a, b) => fn(a, b) const somarNoTerminal = (x, y) => console.log(`Resultado: ${x + y}.`) exec(somarNoTerminal, 56, 38) console.log('=== FIM da outra operação.\n')
Assim, a função readFile
é uma função assíncrona que usa o callback exibirConteudo
para que seja executado no momento (futuro) em que o conteúdo do arquivo dados.txt
tiver sido completamente lido.