‫Instrutor: Bem-vindo de volta!
‫Neste vídeo, vamos ler e escrever
‫dois arquivos como antes, mas de forma assíncrona.
‫Vamos adicionar alguns comentários aqui antes.
‫Então, essa
‫é a forma bloqueadora, síncrona, e então faremos um
‫exercício de forma não bloqueadora, assíncrona.
‫Então, não vamos fazer
‫a mesma coisa, só vamos
‫inventar algum outro tipo de exercício maluco aqui.
‫Então, para ler um arquivo de forma
‫assíncrona, funciona assim.
‫Novamente, precisamos do módulo FS e, em seguida, ler o arquivo, mas desta vez,
‫não ler a sincronização do arquivo, é claro.
‫E, novamente, passamos o nome do arquivo, ou o caminho para
‫o arquivo na verdade, e novamente,
‫é txt, e o arquivo que desejo agora
‫é chamado de início. txt,
‫então este.
‫Opa, desculpe por isso.
‫Então, esse é o arquivo que eu quero, na tarefa é ler isso,
‫e vou explicar o porquê um pouco mais tarde.
‫Por enquanto, não se preocupe com o conteúdo aqui.
‫Portanto, no
‫arquivo lido, não precisamos especificar a codificação do arquivo, certo.
‫E assim, o
‫próximo parâmetro, o segundo será uma função de callback, e
‫isso é o que aprendemos na última aula.
‫Portanto, o Node JS é todo construído em torno
‫de retornos de chamada para implementar um comportamento assíncrono, e
‫é assim que funciona.
‫Portanto, o Node começará a ler este
‫arquivo aqui em segundo plano e, assim que estiver
‫pronto, iniciará a função de retorno de chamada que especificamos aqui.
‫Ok, e ele chama essa função de retorno de
‫chamada com dois argumentos.
‫O primeiro são os erros
‫e o segundo são os dados reais, certo?
‫Portanto, esse estilo de retorno de primeira chamada de erro
‫é muito típico no Node JS, certo.
‫Assim, muitas e muitas vezes,
‫o primeiro parâmetro em um callback será o erro,
‫caso tenha havido, e o segundo será o próprio dado.
‫O que importa
‫aqui é que o erro geralmente é sempre o primeiro, certo?
‫E então, apenas para testar
‫por agora, vamos simplesmente registrar os dados no console.
‫E então, vamos agora realmente testar isso.
‫Mas, antes de
‫fazermos isso, vamos especificar o código do arquivamento aqui, certo?
‫Portanto, não estou cem por cento
‫certo de que
‫funcione sem isso, então limpe isso agora, execute-o novamente e aqui vamos ver.
‫Então, vamos analisar, novamente, o que aconteceu aqui.
‫Assim que esta função aqui for executada, ela
‫começará a ler este arquivo em segundo plano sem
‫bloquear o resto da execução do código.
‫Então, deixe-me demonstrar isso aqui.
‫Então, um console. o
‫log irá ler o arquivo, e só para ter um pouco
‫menos de confusão aí, deixe-me comentar essa parte aqui, ok.
‫E então, o que você acha que vai acontecer agora?
‫Qual registro veremos primeiro?
‫E, de fato, primeiro vemos ler
‫o arquivo, e, só então, vemos ler isso.
‫Então, novamente, por que isso aconteceu?
‫Portanto, como mencionei, o Node JS começará a ler
‫o arquivo em segundo plano aqui, não bloqueará
‫o código e, então, passará imediatamente para a próxima linha de código.
‫E, a próxima linha de código, bem, é este log aqui,
‫e essa é a primeira
‫coisa que será registrada aqui no terminal.
‫Só então, quando um arquivo for completamente lido,
‫esta função de retorno de chamada aqui será executada, ok?
‫E, novamente, essa função de retorno de chamada tem acesso ao erro e
‫aos dados que foram lidos, e
‫poderíamos realmente chamar isso aqui de qualquer coisa que quiséssemos.
‫Poderíamos chamá-lo de texto também, não importa realmente, tudo o
‫que importa é que é o segundo argumento nesta função
‫de retorno de chamada.
‫Na verdade, vamos voltar
‫aos dados porque gosto mais disso.
‫E assim, só então, este console. o log será executado com os dados,
‫e também com o texto que estava no arquivo.
‫E é por isso que vemos isso aqui como o segundo registro.
‫Certo, agora para ir ainda mais
‫longe, vamos realmente fazer outro arquivo de leitura, mas em vez disso,
‫para que eu possa mostrar que podemos basicamente
‫fazer várias etapas, uma após a outra, com retornos de chamada.
‫Portanto, etapas que dependem do resultado da etapa anterior.
‫Ok, é por isso que li isso no arquivo inicial,
‫porque há
‫um arquivo chamado leia isso, que tem
‫o conteúdo no qual estamos realmente interessados.
‫OK?
‫Então, o que vou fazer aqui é copiar
‫este código e colocá-lo aqui.
‫Vou chamar este um de dados um, depois
‫os dados dois, e o resultado da segunda etapa, então o segundo
‫arquivo lido, dependerá do primeiro.
‫Isso porque vamos usar os dados para o nome do arquivo, lembra?
‫Então, aqui estamos fazendo um (murmúrios) agora porque
‫precisamos colocar essa variável, e ela é chamada de dados
‫um.
‫Ok, faz sentido?
‫Então, os dados um serão lidos aqui, ok, e então, na próxima
‫etapa, lemos txt / readthis. txt, que é
‫então isso.
‫Ok, é por isso que este nome de arquivo aqui
‫é o mesmo que este conteúdo.
‫E então, isso é registrado por meio de dados do console para isso.
‫E, vamos testar rapidamente se isso funciona, e de
‫fato, esse é o conteúdo de ler isso. TXT.
‫E, agora, vou dar um passo adiante, mesmo
‫porque há algum outro texto neste arquivo anexado que
‫desejo adicionar a esta primeira string, então há
‫texto vindo do outro arquivo.
‫E assim, temos mais uma
‫etapa que depende da etapa anterior,
‫então o que farei é adicionar outro arquivo de leitura aqui.
‫Então, assim.
‫Então, este é
‫chamado de append, e vou chamá-lo de dados três, dados três aqui,
‫e isso é, novamente, execute isso.
‫E, tudo bem, agora temos esses dois resultados aqui.
‫Tudo bem, e agora finalmente, como última
‫etapa, quero escrever essas duas strings juntas
‫em um arquivo, ok?
‫Até agora, só lemos
‫arquivos, mas também quero escrever um arquivo,
‫então vamos fazer isso aqui também.
‫Então, fs.
‫writeFile e, claro, não estamos usando o síncrono
‫como fizemos
‫antes, mas novamente usamos, assim como aqui e aqui
‫e aqui, usamos a versão assíncrona, não a síncrona.
‫Então, txt slash, faltando este aqui,
‫final.
‫Então, devemos adicionar a codificação de texto aqui também, e então
‫este também aceita uma função de retorno de chamada, mas
‫neste caso não há dados que lemos e, portanto,
‫não precisamos de dois argumentos.
‫Então, o único argumento que temos é o erro, na verdade.
‫Ok, então aqui temos o erro e os dados que foram lidos,
‫mas aqui em writeFile, não há dados.
‫Tudo o que existe, ou pode haver, é um erro, certo?
‫E, na verdade, está
‫faltando algo aqui, que é o que realmente queremos gravar no arquivo.
‫Ok, e esse é o
‫segundo argumento, e o que é, dados dois e dados três.
‫Portanto, novamente uma string (murmura)
‫aqui, dados dois, em
‫seguida, um novo caractere de linha, que novamente, é a barra
‫invertida n, e, em seguida, dados 3.
‫Tudo bem, e assim, assim como com as funções de leitura de arquivo, este retorno
‫de chamada é o que é executado no final, então o que
‫farei aqui é simplesmente registrar através do console que
‫os arquivos foram gravados ou que
‫o arquivo foi foi escrito.
‫Seu arquivo foi escrito e vamos usar alguns emojis
‫divertidos aqui, apenas para deixar o
‫console um pouco mais brilhante
‫para nós, e acho que devemos fazer assim.
‫Portanto, vamos limpar o console mais uma vez,
‫executá-lo e, de fato, veremos que seu arquivo foi gravado.
‫Então, realmente tem?
‫Final.
‫Oh, sim, aqui está.
‫Então, esse é o ler este texto,
‫e o texto anexar, ambos juntos, ambos no mesmo arquivo.
‫Ok, é assim que executamos várias etapas em pedidos, usando
‫funções de retorno de chamada, certo?
‫Pois imagine que você simplesmente fez a leitura do mesmo arquivo, e
‫depois leu o segundo arquivo, então
‫este, logo em seguida.
‫Bem, como você teria acesso aos
‫dados do primeiro, certo?
‫E é assim que surge esse padrão.
‫Na verdade, tem
‫seu próprio nome, e acho que
‫mencionei isso no último vídeo, é o
‫chamado callback hell, e há algumas soluções para tornar este
‫código mais legível e melhor para entender, mas
‫por enquanto, isso não importa em tudo para você.
‫O que importa é que o Node JS
‫foi construído em torno dessa filosofia de
‫callbacks, então é assim que o Node JS implementa operações
‫assíncronas, chamando callbacks assim que
‫a operação que está fazendo for concluída.
‫E, aliás, essa função de forma de escrita que
‫você vê aqui, de novo,
‫caso não esteja familiarizado
‫com ela, é a nova sintaxe do ES6 também, ok?
‫Então, novamente, espero que você esteja familiarizado
‫com o ES6 neste momento,
‫e que tudo isso faça sentido para você.
‫Se você fosse escrever esta
‫função aqui sem a sintaxe da função
‫de erro, faríamos simplesmente assim, function, err, data one, e
‫então assim.
‫Então, essa é
‫uma função normal, digamos uma função
‫antiquada, e a nova versão funciona assim.
‫A diferença entre eles é principalmente a sintaxe, mas também o
‫fato de que uma função de erro, portanto,
‫esse tipo de
‫função, não obtém sua própria palavra-chave de
‫disco, então usa a palavra-chave de disco da função pai.
‫E isso é chamado de palavra-chave de disco lexical,
‫enquanto uma função normal como essa
‫sempre obtém sua própria palavra-chave de disco, certo?
‫Tenho certeza que você está familiarizado com esse
‫tipo de coisa, mas apenas fazendo uma pequena revisão aqui, caso não esteja.
‫Ok, espero que tenha feito desde então.
‫Na verdade, nunca usamos esse erro, não tratamos
‫nenhum erro, então,
‫por exemplo, imagine que esse arquivo aqui não existisse.
‫Bem, poderíamos ter usado este erro
‫e vamos fazer isso, mas apenas para este aqui, então
‫não quero criar todos esses manipuladores de erros aqui, mas apenas nesta
‫situação, digamos que houve um erro, e assim
‫digamos que se erro, o
‫retorno desta função, então não faça mais
‫nada, e registre
‫no console, erro, e então podemos adicionar algum outro emoji aqui,
‫como esta explosão, então como algo explodiu aqui.
‫Então, vamos agora mudar isso aqui, como começar. txt, execute-o novamente e, portanto, temos
‫esse
‫erro agora, então ele nos dá esse log para
‫o console e, como retornamos, ele
‫não fará nada depois disso, então tudo isso é
‫basicamente ignorado e não será executado , que é
‫exatamente o que queremos.
‫Certo, mas se colocarmos de volta ao normal
‫e depois
‫rodarmos novamente, então tudo funcionará como antes.
‫Portanto, acostume-se com esse padrão de retornos de chamada, porque
‫você o verá em todos os lugares no Node JS
‫e em toda esta seção.