Advertisement
  1. Code
  2. Web Development

Utilizzando il modulo di evento del nodo

by
Read Time:10 minsLanguages:

Italian (Italiano) translation by Loris Pizii (you can also view the original English article)

Quando ho sentito parlare di node. js, pensavo che fosse solo un'implementazione JavaScript per il server. Ma è in realtà molto di più: si tratta con una serie di funzioni predefinite che non si ottiene nel browser. Uno di quei bit di funzionalità è il modulo di evento, che ha la classe di EventEmitter. Ci troveremmo di fronte a quello in questo tutorial.


EventEmitter: Cosa e perché

Uno ultima vantaggi agli eventi: sono un modo molto sciolto di parti di accoppiamento del codice insieme.

Così, che cosa fa esattamente la classe di EventEmitter? In parole povere, ti permette di ascoltare per "eventi" e assegnare azioni da eseguire quando si verificano tali eventi. Se si ha familiarità con JavaScript front-end, saprete su eventi di mouse e tastiera che si verificano su determinate interazioni dell'utente. Questi sono molto simili, tranne che noi possiamo emettere eventi per conto nostro, quando vogliamo e non necessariamente basati sull'interazione utente. I principi su che eventemitter si basa sono stati chiamati il modello di pubblicazione/sottoscrizione, perché possiamo sottoscrivere gli eventi e quindi pubblicarli. Ci sono molte librerie front-end costruite con il supporto di pubblicazione/sottoscrizione, ma nodo ha costruire.

L'altra questione importante è questa: perché si utilizza il modello di evento? Nel nodo, è un'alternativa ai callback di nidificazione. Un sacco di metodi di nodo vengono eseguite in modo asincrono, il che significa che per eseguire codice dopo il metodo ha concluso, è necessario passare un metodo di callback alla funzione. Alla fine, il codice sarà simile a un imbuto gigante. Per evitare ciò, molte classi di nodo emettono eventi che è possibile attendere. Ciò consente di organizzare il codice il modo che vorrei e non utilizzare i callback.

Uno ultima vantaggi agli eventi: sono un modo molto sciolto di parti di accoppiamento del codice insieme. Un evento può essere generato, ma se nessun codice è in ascolto per esso, va bene: appena passò inosservato. Questo significa rimuovere ascoltatori (o evento emissioni) non comporti errori JavaScript.


Utilizzando EventEmitter

Inizieremo con la classe EventEmitter per sé. È abbastanza semplice arrivare a: richiediamo solo il modulo eventi:

Questo oggetto di eventi ha una singola proprietà, che è la stessa classe di EventEmitter. Allora, facciamo un esempio semplice per i principianti:

Iniziamo creando un nuovo oggetto EventEmitter. Questo oggetto ha due metodi principali che utilizziamo per eventi: on ed emettono.

Cominciamo con on. Questo metodo accetta due parametri: Iniziamo con il nome dell'evento vi ascoltiamo per: in questo caso, che è "someEvent". Ma naturalmente, potrebbe essere qualsiasi cosa, e solitamente potrai scegliere qualcosa di meglio. Il secondo parametro è la funzione che verrà chiamata quando si verifica l'evento. Che è tutto ciò che serve per l'impostazione di un evento.

Ora, per generare l'evento, si passa il nome dell'evento per il EventEmitter dell'istanza metodo emit. Che è l'ultima riga del codice precedente. Se si esegue questo codice, vedrete che otteniamo il testo stampato nella console.

Che è l'utilizzo di base di un EventEmitter. È inoltre possibile includere dati quando la generazione degli eventi:

Che è solo un parametro di data, ma è possibile includere come molti come si desidera. Per utilizzarli nella vostra funzione di gestore di eventi, appena li prendono come parametri:

Prima di continuare, mi permetta di chiarire parte della funzionalità EventEmitter. Possiamo avere più listener per ogni evento; più listener di eventi possono essere assegnati (tutte con su), e tutte le funzioni verranno chiamate quando viene generato l'evento. Per impostazione predefinita, nodo consente agli ascoltatori di fino a dieci su un evento in una sola volta; Se più sono creati, nodo verrà generato un avviso. Tuttavia, possiamo cambiare questo importo utilizzando setMaxListeners. Ad esempio, se si esegue questo, si dovrebbe vedere che un avviso stampato sopra l'output:

Per impostare il numero massimo di spettatori, aggiungere questa riga sopra gli ascoltatori:

Ora quando si esegue, non otterrete un messaggio di avviso.


Altri metodi di EventEmitter

Ci sono alcuni altri metodi di EventEmitter che troverete utile.

Ecco una ordinata: once. È proprio come il metodo su, tranne che funziona solo una volta. Dopo essere stato chiamato per la prima volta, viene rimosso il listener.

Se si esegue questo, vedrete solo una volta il messaggio. La seconda emissione dell'evento non è ripresa da qualsiasi listener (e va bene, a proposito), perché una volta che il listener once è stato rimosso dopo essere stato usato una volta.

Parlando di rimozione di ascoltatori, che possiamo fare noi stessi, manualmente, in pochi modi. In primo luogo, siamo in grado di rimuovere un singolo listener con il metodo removeListener. Accetta due parametri: il nome dell'evento e la funzione listener. Finora, abbiamo usato le funzioni anonime come nostri ascoltatori. Se vogliamo essere in grado di rimuovere un listener, più tardi, esso sarà necessario essere una funzione con un nome che noi possiamo fare riferimento. Possiamo usare questo metodo removeListener per duplicare gli effetti di una volta metodo once:

Se si esegue questo, vedrai che ha lo stesso effetto come una volta.

Se si desidera rimuovere tutti i listener associati a un determinato evento, è possibile utilizzare removeAllListeners; appena passa il nome dell'evento:

Per rimuovere tutti i listener per tutti gli eventi, chiamare la funzione senza parametri.

C'è un ultimo metodo: ascoltatore. Questo metodo accetta un nome di evento come parametro e restituisce una matrice di tutte le funzioni che sono in ascolto per tale evento. Ecco un esempio di che, in base il nostro esempio di onlyOnce:

Finiremo questa sezione con un po' di meta-ness. Il nostro EventEmitter istanza stessa effettivamente fuochi due eventi propri, che possiamo ascoltare per: uno quando creiamo nuovi ascoltatori e uno quando li rimuove. Vedere qui:

L'esecuzione di questo, vedrete i nostri ascoltatori per nuovi ascoltatori e rimosso gli ascoltatori sono stati eseguiti, e otteniamo i messaggi che ci aspettavamo.

Così, ora che abbiamo visto tutti i metodi che dispone di un'istanza di EventEmitter, vediamo come funziona in combinazione con altri moduli.

Moduli di EventEmitter interno

Poiché la classe EventEmitter è solo regolari JavaScript, ha perfettamente senso che può essere utilizzato all'interno di altri moduli. Dentro i vostri moduli di JavaScript, è possibile creare istanze di EventEmitter e utilizzarli per gestire gli eventi interni. Questo è semplice, però. Più interessante, sarebbe quello di creare un modulo che eredita da EventEmitter, in modo che possiamo utilizzare da parte sua funzionalità dell'API pubblica.

In realtà, ci sono built-in moduli di nodo che fare esattamente questo. Ad esempio, si può essere familiarità con il modulo http; Questo è il modulo che userai per creare un server web. Questo esempio viene illustrato come il metodo della classe EventEmitter è diventato parte di http. Classe server:

Se si esegue questo frammento, il processo attenderà una richiesta; si può andare a http://localhost:3000 e avrai la risposta. Quando l'istanza del server riceve la richiesta dal tuo browser, emette un evento di "richiesta", un evento che il nostro ascoltatore riceverà e può agire.

Quindi, come possiamo andare sulla creazione di una classe che eredita da EventEmitter? Non è in realtà non è così difficile. Creeremo una semplice classe UserList, che gestisce gli oggetti utente. Così, in un file di userlist.js, inizieremo con questo:

Abbiamo bisogno del modulo util per aiutare con l'ereditarietà. Quindi, abbiamo bisogno di un database: invece di utilizzare un database reale, però, useremo un oggetto:

Ora, in realtà possiamo creare il nostro modulo. Se non avete familiarità con moduli di nodo, ecco come funzionano: qualsiasi JavaScript scriviamo all'interno di questo file è solo leggibile all'interno del file, per impostazione predefinita. Se vogliamo renderlo parte del modulo del pubblico API, ci rendono una proprietà di module.exports, o assegnare un nuovo oggetto o funzione a module.exports. Facciamo così:

Questa è la funzione costruttore, ma non è la solita funzione costruttore JavaScript. Cosa stiamo facendo qui è utilizzando il metodo di chiamata del costruttore di EventEmitter per l'esecuzione di quel metodo sul nuovo oggetto UserList (che è questo). Se abbiamo bisogno di fare qualsiasi altra operazione di inizializzazione al nostro oggetto, potremmo farlo all'interno di questa funzione, ma che è tutto ciò che faremo per ora.

Ereditando il costruttore non è sufficiente però; Abbiamo anche bisogno di ereditare il prototipo. Questo è dove entra il modulo util.

Questo aggiungerà tutto ciò che è il EventEmitter.prototype di UserList.prototype; Ora, nostro istanze UserList avrà tutti i metodi di un'istanza di EventEmitter. Ma vogliamo aggiungere alcuni di più, naturalmente. Aggiungeremo un salvataggio metodo, per permetterci di aggiungere nuovi utenti.

Questo metodo accetta un oggetto per salvare il nostro "database": aggiunge un id e lo spinge nella matrice di utenti. Quindi, si emette l'evento "salvato-utente" e passa l'oggetto come dati. Se questo fosse un vero e proprio database, salvandolo probabilmente sarebbe un'attività asincrona, che significa che per lavorare con i record salvati ci servirebbero ad accettare un callback. L'alternativa a questo è quello di generare un evento, come stiamo facendo. Ora, se vogliamo fare qualcosa con il record salvato, possiamo solo ascoltare per l'evento. Lo faremo in un secondo. Appena chiudiamo il UserList

Ho aggiunto un altro metodo: un semplice che restituisce tutti gli utenti. Quindi, assegniamo UserList alla module.exports.

Ora, vediamo questo in uso; in un altro file, dire test. js. Aggiungere quanto segue:

Dopo che richiedono il nostro nuovo modulo e creando un'istanza di esso, ascoltiamo per l'evento "salvato-utente". Quindi, possiamo andare avanti e salvare pochi utenti. Quando si esegue questo, vedrai che otteniamo due messaggi, stampa i nomi e gli ID dei record abbiamo salvato.

Naturalmente, questo potrebbe funzionare l'altro senso intorno: noi potremmo essere utilizzando il metodo all'interno della nostra classe e metodo emit fuori o entrambi dentro o fuori. Ma questo è un buon esempio di come potrebbe essere fatto.


Conclusione

Ecco come funziona la classe EventEmitter del nodo. Qui di seguito troverete i link alla documentazione di nodo per alcune delle cose che noi abbiamo parlato.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.