Nodeova moćna arhitektura vođena događajima jedna je od njegovih najvećih prednosti.

Ključni zahvati

  • Programiranje vođeno događajima dobar je izbor za interaktivne aplikacije, posebno GUI aplikacije, jer omogućuje kodu da odgovori na radnje korisnika bilo kojim redoslijedom.
  • Programiranje vođeno događajima obično se koristi u web-aplikacijama, gdje se slušatelji događaja pokreću kada korisnici komuniciraju s DOM-om.
  • Implementacija programiranja vođenog događajima u Node.js jednostavna je s klasom EventEmitter, koja vam omogućuje stvaranje prilagođenih događaja i prilaganje slušatelja događaja za njihovu obradu.

Prilikom izrade bilo koje softverske aplikacije, jedna ključna odluka uključuje odabir odgovarajuće paradigme za vaš kod.

Programiranje vođeno događajima dobar je izbor za interaktivne aplikacije koje reagiraju na radnje korisnika koje se mogu dogoditi bilo kojim redoslijedom. To je popularnija paradigma s GUI aplikacijama nego s programima naredbenog retka ili kodom ugrađenih sustava.

instagram viewer

Što su događaji?

Događaj možete zamisliti kao radnju ili pojavu koju vaš kod može prepoznati i na koju može odgovoriti. Sustav ili korisnik može pokrenuti događaj i vaš kod će obično registrirati funkciju koja će njime upravljati.

Primjer osnovnog događaja je klik na gumb za izvođenje određene radnje. Čin klikanja gumba pokreće događaj, a funkcija koja se pokreće kada dođe do klika naziva se slušatelj događaja (ili rukovatelj).

Što je programiranje vođeno događajima?

Programiranje vođeno događajima je a paradigma programiranja u kojem tijek izvršenja aplikacije ovisi o događajima koji se događaju, a ne da bude striktno sekvencijalan.

Ova se paradigma uglavnom koristi pri izgradnji korisničkih sučelja i aplikacija u stvarnom vremenu, gdje bi događaj kao što je radnja korisnika trebao pokrenuti radnju u sustavu.

Paradigma je vrlo popularna pri izradi web-aplikacija, gdje se slušatelji događaja pokreću kada korisnici komuniciraju s njima objektni model dokumenta (DOM).

Sljedeća slika vizualizira kako tijek funkcionira u programiranju vođenom događajima. Kada se dogodi događaj, kanal događaja ga prima i prosljeđuje odgovarajućem slušatelju za obradu:

Programiranje vođeno događajima u Node.js

The JavaScript petlja događaja jedan je od temeljnih koncepata iza asinkrone prirode Node.js runtimea. Arhitektura vođena događajima koristi svoj ugrađeni EventEmitter modul za olakšavanje besprijekornog tijeka izvršenja.

Uz programiranje vođeno događajima, Node.js vam omogućuje stvaranje aplikacija na strani poslužitelja koje mogu upravljati korisničkom interakcijom, I/O operacijama i obradom podataka u stvarnom vremenu. To se događa na način bez blokiranja, što rezultira poboljšanim performansama i lakšim iskustvom za korisnika.

Implementacija programiranja vođenog događajima u Node.js jednostavna je ako razumijete osnove definiranja, pokretanja i rukovanja događajima.

Klasa EventEmitter

s EventEmitter klase u Node.js, možete kreirati prilagođene događaje i priložiti slušatelje događaja koji će njima upravljati. Da biste koristili klasu u svom kodu, uvezite je iz događanja modul poput ovog:

// CommonJS
const { EventEmitter } = require("events")

// ES6
import { EventEmitter } from"events"

Klasa i njezine funkcije članice tada su vam dostupne za korištenje u vašoj aplikaciji. Za početak emitiranja i rukovanja događajima, inicijalizirajte novu instancu EventEmitter razreda.

Na primjer:

const FoodEvents = new EventEmitter()

Time se stvara novi emiterski objekt tzv FoodEvents koji može emitirati događaje i registrirati slušatelje. Klasa EventEmmitter nudi tri metode za slušanje događaja: na, addListener, i jednom.

The na metoda je najosnovnija funkcija za dodavanje slušatelja događaja i addListener radi na potpuno isti način. Oba prihvaćaju naziv događaja i funkciju povratnog poziva kao argumente. Povratni poziv je stvarna funkcija rukovatelja. Možeš koristiti na i addListener naizmjenično.

Evo kako postupati s događajem pomoću na metoda:

FoodEvents.on("cookie_ready", (data) => {
console.log("Cookie ready for packaging, data received: ", data);
})

Korištenje addListener kao izravna alternativa za na:

FoodEvents.addListener("cookie_ready", (data) => {
console.log(
"Cookie will now be packaged and sent out, data received: ",
data
);
})

Oba ova primjera će dodati povratni poziv nizu slušatelja događaja za kolačić_spreman događaj. Ako koristite oba, njihovi povratni pozivi aktivirat će se redom.

The jednom metoda registrira jednokratni slušatelj događaja koji se pokreće sljedeći put kada se događaj pokrene. Nakon toga sustav će ga ukloniti iz niza slušatelja.

Evo kako koristiti jednom za obradu jednokratnog događaja:

FoodEvents.once("cookie_sent", (data) => {
console.log("Cookie is sent out, data received: ", data);
})

U ovom slučaju, emiter će samo slušati za kolačić_poslan događaj jednom i uklonite rukovatelj nakon što se pokrene.

Sve tri metode vraćaju emiter, tako da možete lančano pozivati ​​bilo koju od njih.

Ne zaboravite da, kako bi slušatelj obradio događaj, aplikacija mora emitirati taj događaj u nekom trenutku. Evo primjera koda za emitiranje kolačić_spreman događaj pomoću emitirati metoda:

functionbakeCookie() {
console.log("Cookie is baking, almost ready...")

setTimeout(() => {
FoodEvents.emit("cookie_ready", { flavor: "vanilla cookie" })
}, 3000)
}

bakeCookie()

Kada pokrenete ovaj kod koji ispisuje obavijest na konzoli da se kolačić peče, čeka 3 sekunde i emitira kolačić_spreman događaja, dobit ćete izlaz kao na slici ispod:

Ovo pokazuje kako se slušatelji događaja izvode redoslijedom kojim ste ih registrirali.

The EventEmitter klasa pruža više metoda, uključujući:

  • removeListener: Uklanja instancu slušatelja iz niza slušatelja događaja. The isključeno metoda je također dostupna za ovu svrhu.
  • prependListener: Ova metoda također registrira slušatelja, ali umjesto da ga dodaje na kraj niza slušatelja, dodaje ga na početak. Tada će se pokrenuti prije svih drugih slušatelja koje ste možda već registrirali.
  • prependOnceListener: Ovo radi isto kao prependListener, ali slušač se pokreće samo jednom, kao u slučaju jednom.
  • ukloniSveSlušatelje: Ova funkcija uklanja sve registrirane slušatelje za određeni imenovani događaj ili sve slušatelje ako mu ne proslijedite nijedan argument.
  • slušatelja: Vraća niz slušatelja naziva događaja koji mu proslijeđujete kao argument.
  • imena događaja: Ovu funkciju možete koristiti za dobivanje svih naziva događaja za koje ste već registrirali slušatelja.
  • setMaxListeners: Node.js prema zadanim postavkama izbacuje upozorenje kada registrirate više od 10 slušatelja za događaj, kako bi se spriječilo curenje memorije. Ovu zadanu vrijednost možete prilagoditi pomoću setMaxListeners. Također možete provjeriti ovu vrijednost pomoću getMaxListeners.

The događanja paket pruža sveobuhvatnu funkcionalnost za programiranje vođeno događajima u Node.js.

Koji su najbolji primjeri programiranja vođenog događajima?

Svaki pristup programiranju ima svoje nedostatke, a ignoriranje najboljih praksi može imati negativne učinke na vašu aplikaciju. Slijede neki od najboljih primjera iz prakse koje treba uzeti u obzir prilikom izrade aplikacija vođenih događajima:

  • Koristite sažeta i opisna imena za događaje kako biste omogućili čistu bazu koda koju je moguće održavati.
  • Usvojite dobru praksu rukovanja pogreškama i zapisivanja kako biste omogućili jednostavno otklanjanje pogrešaka.
  • Izbjegavajte pakao povratnih poziva (gniježđenje više povratnih poziva) kada pišete slušatelje događaja. Umjesto toga koristite obećanja JavaScripta.
  • Ne stvarajte previše slušatelja za jedan događaj. Umjesto toga razmislite o razdvajanju događaja i njihovom lančanom povezivanju.

Izradite aplikacije s pravom arhitekturom

Opće pravilo koje se primjenjuje na izradu softvera je donošenje odgovarajućih odluka o arhitekturi i dizajnu. Kada slijedite pogrešan pristup izradi aplikacije, na kraju ćete se suočiti s posljedicama.

Programiranje vođeno događajima je paradigma koja može imati značajan utjecaj na arhitekturu i performanse aplikacije. Kad god funkcioniranje vaše aplikacije ili njenog dijela ovisi o događajima, trebali biste razmotriti programiranje vođeno događajima.