‫Istruttore: Gli stream sono un altro concetto fondamentale in
‫Node. JS.
‫Quindi ora impariamo tutto su di loro.
‫Quindi, prima di tutto, cosa sono i flussi?
‫Bene, con i flussi possiamo elaborare il significato di leggere e scrivere
‫i dati pezzo per pezzo senza completare l'intera operazione
‫di lettura o scrittura.
‫Pertanto non è necessario mantenere tutti i dati in
‫memoria per eseguire queste operazioni.
‫Ad esempio, quando leggiamo un file utilizzando i flussi,
‫leggiamo parte dei dati, facciamo qualcosa con esso, quindi
‫liberiamo la nostra memoria e ripetiamo l'operazione fino a quando l'intero file non
‫è stato elaborato.
‫Oppure pensa a YouTube o Netflix,
‫che sono entrambe chiamate società
‫di streaming perché trasmettono video utilizzando lo stesso principio.
‫Quindi, invece di attendere il caricamento dell'intero file video, l'elaborazione
‫viene eseguita pezzo per pezzo o in blocchi in
‫modo da poter iniziare a guardare anche prima che l'intero file
‫sia stato scaricato.
‫Quindi il principale qui non riguarda solo Node. JS.
‫Ma universale per l'informatica in generale.
‫Quindi, come puoi vedere, questo rende gli stream il candidato
‫perfetto per gestire grandi volumi di dati come ad
‫esempio video o anche dati che stiamo ricevendo pezzo per pezzo
‫da una fonte esterna.
‫Inoltre, lo streaming rende l'elaborazione dei dati più efficiente in
‫termini di memoria perché non è necessario
‫mantenere tutti i dati in memoria e anche in termini di
‫tempo perché possiamo iniziare a elaborare i dati non
‫appena arrivano, piuttosto che aspettare che arrivi tutto.
‫Ok, ora che sappiamo cosa sono gli stream,
‫parliamo un po' di come sono implementati in
‫Node. JS.
‫Quindi in Node esistono quattro tipi fondamentali di flussi:
‫flussi leggibili, flussi scrivibili, flussi duplex e
‫flussi di trasformazione.
‫Ma quelli leggibili e scrivibili sono
‫i più importanti.
‫E quindi ci concentreremo maggiormente su questi due.
‫Quindi i flussi leggibili sono quelli da cui possiamo leggere.
‫Possiamo consumare dati, ha senso giusto?
‫Ora i flussi sono ovunque nei moduli principali del nodo.
‫Quindi un po' come gli eventi, di cui abbiamo parlato prima.
‫Ad esempio, i dati che arrivano quando un server http
‫riceve una richiesta sono in realtà un flusso leggibile.
‫Quindi tutti i dati che vengono inviati con la richiesta arrivano
‫pezzo per pezzo e non in un pezzo grande.
‫Anche un altro esempio dal file system è che
‫possiamo leggere un file pezzo per pezzo
‫usando una schermata di lettura dal modulo FS, che in
‫realtà può essere molto utile per file di testo di grandi dimensioni.
‫Bene, ora un'altra cosa importante da
‫notare è che i flussi sono in
‫realtà istanze della classe EventEmitter.
‫Ciò significa che tutti i flussi possono emettere e
‫ascoltare eventi denominati.
‫Proprio come abbiamo imparato nell'ultima lezione.
‫Nel caso di flussi leggibili, possono emettere
‫e possiamo ascoltare molti eventi diversi.
‫Ma i due più importanti sono i dati e gli eventi finali.
‫L'evento di dati viene emesso quando c'è una nuova
‫parte di dati da
‫consumare e l'evento di fine viene emesso non appena
‫non ci sono più dati da consumare.
‫E, naturalmente, possiamo quindi reagire
‫di conseguenza a questi eventi.
‫E in effetti lo faremo esattamente nel prossimo video.
‫Quindi, per esercitarti a lavorare con i flussi.
‫Infine, oltre agli eventi, abbiamo anche importanti funzioni che
‫possiamo utilizzare sugli stream.
‫E nel caso di flussi leggibili,
‫i più importanti sono la pipe e le funzioni di lettura.
‫E ancora, li vedrai in azione nel prossimo
‫video, in particolare l'importantissima funzione pipe, che
‫sostanzialmente ci consente di collegare i flussi insieme,
‫passando i dati da un
‫flusso all'altro senza doversi preoccupare molto degli eventi.
‫Ok, il prossimo passo è che i flussi scrivibili sono
‫quelli su cui possiamo scrivere i dati.
‫Quindi, in pratica, l'opposto dei flussi leggibili.
‫Un ottimo esempio è la risposta http che possiamo inviare al client
‫e che in realtà è un flusso scrivibile.
‫Quindi un flusso in cui possiamo scrivere i dati.
‫Quindi, quando vogliamo inviare dati, dobbiamo scriverli da qualche
‫parte, giusto?
‫E da qualche parte c'è un flusso scrivibile, e
‫questo ha perfettamente senso, giusto?
‫Ad esempio, se volessimo inviare un file video di grandi
‫dimensioni a un client, trasmetteremmo quel
‫risultato in streaming proprio come fanno Netflix o YouTube.
‫Ora riguardo agli eventi, i più importanti sono gli
‫eventi di scarico e di arrivo.
‫E le funzioni più importanti
‫sono le funzioni di scrittura e
‫fine, alcune delle quali vedrai in azione nella prossima lezione.
‫Ora rapidamente sui flussi duplex.
‫Sono semplicemente flussi leggibili e scrivibili allo
‫stesso tempo.
‫Questi sono un po' meno comuni.
‫Ma comunque, un buon esempio potrebbe essere un socket
‫web dal modulo net.
‫E un web socket è fondamentalmente solo un
‫canale di comunicazione tra client e server che funziona in entrambe
‫le direzioni e rimane aperto una volta stabilita la connessione.
‫Infine, i flussi di trasformazione sono flussi
‫duplex, quindi flussi leggibili e scrivibili, che allo
‫stesso tempo possono modificare o trasformare
‫i dati mentre vengono letti o scritti.
‫Un buon esempio di questo è il modulo
‫core zlib per comprimere i dati che utilizza effettivamente un flusso di trasformazione.
‫Va bene, e questi sono i quattro tipi
‫di flussi e un'ampia panoramica di come possiamo usarli.
‫Ora c'è qualcosa di importante da
‫menzionare qui prima
‫di andare avanti, il che è un fatto che
‫questi eventi e funzioni che ti ho mostrato sono per
‫consumare flussi che sono già implementati come quelli
‫che ti ho mostrato qui come nostri esempi.
‫Quindi, ad esempio, Node ha implementato queste richieste e risposte
‫http come flussi
‫e noi possiamo quindi consumarli, possiamo usarli
‫usando gli eventi e le funzioni disponibili
‫per ogni tipo di flusso.
‫Ovviamente potremmo anche implementare i nostri
‫flussi e quindi consumarli utilizzando gli stessi eventi e funzioni.
‫Quello, tuttavia, sarebbe un video per un'altra volta perché
‫per creare la maggior parte
‫delle app, è molto importante sapere come consumare effettivamente
‫i flussi, non davvero come implementarli.
‫Bene, ora andiamo avanti e usiamo
‫gli stream nella pratica.