Galinga „Node“ įvykiais pagrįsta architektūra yra vienas stipriausių jos pranašumų.

Key Takeaways

  • Įvykiais pagrįstas programavimas yra geras pasirinkimas interaktyvioms programoms, ypač GUI programoms, nes leidžia kodui reaguoti į vartotojo veiksmus bet kokia tvarka.
  • Įvykiais pagrįstas programavimas dažniausiai naudojamas žiniatinklio programose, kur įvykių klausytojai suaktyvina naudotojams sąveikaujant su DOM.
  • Įvykiais pagrįstą programavimą Node.js lengva įdiegti naudojant EventEmitter klasę, kuri leidžia kurti pasirinktinius įvykius ir pridėti įvykių klausytojus, kad jie tvarkytų.

Kuriant bet kokią programinę įrangą, vienas esminis sprendimas yra pasirinkti tinkamą kodo paradigmą.

Įvykiais pagrįstas programavimas yra geras pasirinkimas interaktyvioms programoms, kurios reaguoja į vartotojo veiksmus, kurie gali įvykti bet kokia tvarka. Tai populiaresnė GUI programų paradigma nei komandinės eilutės programos ar įterptųjų sistemų kodas.

Kas yra Renginiai?

Galite galvoti apie įvykį kaip apie veiksmą ar įvykį, kurį jūsų kodas gali atpažinti ir į kurį reaguoti. Sistema arba vartotojas gali suaktyvinti įvykį, o jūsų kodas paprastai užregistruos funkciją, skirtą jam tvarkyti.

instagram viewer

Pagrindinio įvykio pavyzdys yra mygtuko paspaudimas, norint atlikti tam tikrą veiksmą. Mygtuko paspaudimas suaktyvina įvykį, o funkcija, kuri vykdoma spustelėjus, vadinama renginio klausytoja (arba prižiūrėtojas).

Kas yra įvykiais pagrįstas programavimas?

Įvykiais pagrįstas programavimas yra a programavimo paradigma kuriose programos vykdymo eiga priklauso nuo įvykių, kurie įvyksta, o ne yra griežtai nuoseklūs.

Ši paradigma dažniausiai naudojama kuriant vartotojo sąsajas ir realaus laiko programas, kai įvykis, pvz., vartotojo veiksmas, turėtų sukelti veiksmą sistemoje.

Paradigma yra labai populiari kuriant žiniatinklio programas, kur įvykių klausytojai suaktyvina, kai vartotojai sąveikauja su dokumento objekto modelis (DOM).

Toliau pateiktame paveikslėlyje parodyta, kaip srautas veikia įvykiais pagrįstame programavime. Įvykus įvykiui, įvykio kanalas jį priima ir perduoda atitinkamam klausytojui, kad jis tvarkytų:

Įvykiais pagrįstas programavimas Node.js

The „JavaScript“ įvykių ciklas yra viena iš pagrindinių sąvokų, susijusių su Node.js vykdymo laiko asinchroniškumu. Įvykiais pagrįsta architektūra naudoja integruotą EventEmitter modulis, palengvinantis sklandų vykdymo srautą.

Naudodami įvykiais pagrįstą programavimą, Node.js leidžia kurti serverio programas, kurios gali tvarkyti vartotojo sąveiką, įvesties / išvesties operacijas ir apdoroti duomenis realiuoju laiku. Tai vyksta neblokuojančiu būdu, todėl vartotojas pagerina našumą ir sklandžiau naudojasi.

Įvykiais pagrįstą programavimą Node.js įdiegti lengva, kai suprantate įvykių apibrėžimo, suaktyvinimo ir tvarkymo pagrindus.

„EventEmitter“ klasė

Su EventEmitter klasę Node.js, galite kurti pasirinktinius įvykius ir pridėti įvykių klausytojus, kad jie tvarkytų. Norėdami naudoti klasę savo kode, importuokite ją iš įvykius toks modulis:

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

// ES6
import { EventEmitter } from"events"

Tada galite naudoti klasę ir jos narių funkcijas savo programoje. Norėdami pradėti siųsti ir tvarkyti įvykius, inicijuokite naują egzempliorių EventEmitter klasė.

Pavyzdžiui:

const FoodEvents = new EventEmitter()

Taip sukuriamas naujas emiterio objektas, vadinamas Maisto renginiai kurios gali skleisti įvykius ir registruoti klausytojus. EventEmmitter klasėje pateikiami trys įvykio klausymo būdai: įjungta, AddListener, ir kartą.

The įjungta metodas yra pagrindinė įvykių klausytojų įtraukimo funkcija ir AddListener veikia lygiai taip pat. Jie abu priima įvykio pavadinimą ir atgalinio skambinimo funkciją kaip argumentus. Atgalinis skambutis yra tikroji tvarkyklės funkcija. Tu gali naudoti įjungta ir AddListener pakaitomis.

Štai kaip tvarkote įvykį naudodami įjungta metodas:

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

Naudojant AddListener kaip tiesioginė alternatyva įjungta:

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

Abu šie pavyzdžiai įtrauks atgalinį skambutį į įvykių klausytojų masyvą cookie_ready įvykis. Jei naudosite abu, jų atgaliniai skambučiai suaktyvės eilės tvarka.

The kartą metodas registruoja vienkartinį įvykių klausytoją, kuris paleidžiamas kitą kartą, kai įvykis suaktyvinamas. Po to sistema pašalins jį iš klausytojų masyvo.

Štai kaip naudoti kartą tvarkyti vienkartinį įvykį:

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

Tokiu atveju emiteris tik klausys cookie_sent įvykį vieną kartą ir pašalinkite tvarkyklę jam pasibaigus.

Visi trys metodai grąžina emiterį, todėl galite sujungti skambučius į bet kurį iš jų.

Nepamirškite, kad tam, kad klausytojas galėtų valdyti įvykį, programa tam tikru momentu turi perduoti tą įvykį. Štai keletas pavyzdinių kodų, kuriuos reikia išleisti cookie_ready įvykis naudojant skleisti metodas:

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

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

bakeCookie()

Kai paleidžiate šį kodą, kuris konsolėje atspausdina pranešimą, kad sausainis kepa, laukia 3 sekundes ir išsiunčia cookie_ready įvykį, gausite išvestį, kaip parodyta toliau pateiktame paveikslėlyje:

Tai parodo, kaip įvykių klausytojai veikia tokia tvarka, kokia juos registruojate.

The EventEmitter klasė suteikia daugiau metodų, įskaitant:

  • pašalinti klausytoją: pašalina klausytojo egzempliorių iš įvykių klausytojų masyvo. The išjungti šiuo tikslu taip pat yra metodas.
  • prependListener: Šis metodas taip pat užregistruoja klausytoją, bet užuot įtraukęs jį į klausytojų masyvo pabaigą, prideda jį prie pradžios. Tada jis bus paleistas anksčiau nei kiti klausytojai, kuriuos galbūt jau užregistravote.
  • prependOnceListener: Tai veikia kaip prependListener, bet klausytojas paleidžiamas tik vieną kartą, kaip ir kartą.
  • pašalinti visus klausytojus: Ši funkcija pašalina visus registruotus konkretaus pavadinto įvykio klausytojus arba visus klausytojus, jei nepateiksite jo argumento.
  • klausytojai: pateikia įvykio pavadinimo, kurį jam perduodate kaip argumentą, klausytojų masyvą.
  • įvykių pavadinimai: galite naudoti šią funkciją norėdami gauti visų įvykių, kuriems jau užregistravote klausytoją, pavadinimus.
  • setMaxListeners: Node.js pagal numatytuosius nustatymus pateikia įspėjimą, kai įvykiui užregistruojate daugiau nei 10 klausytojų, kad būtų išvengta atminties nutekėjimo. Šią numatytąją reikšmę galite koreguoti naudodami setMaxListeners. Šią vertę taip pat galite patikrinti naudodami getMaxListeners.

The įvykius paketas suteikia visapusiškas įvykiais pagrįsto programavimo funkcijas Node.js.

Kokia yra įvykiais pagrįsto programavimo geriausia praktika?

Kiekvienas programavimo metodas turi kompromisų, o geriausios praktikos ignoravimas gali turėti neigiamos įtakos jūsų programai. Toliau pateikiamos kelios geriausios praktikos, į kurias reikia atsižvelgti kuriant įvykiais pagrįstas programas.

  • Naudokite glaustus ir aprašomus įvykių pavadinimus, kad sukurtumėte švarią ir prižiūrimą kodų bazę.
  • Taikykite gerą klaidų tvarkymo ir registravimo praktiką, kad būtų galima lengvai derinti klaidas.
  • Rašydami įvykių klausytojus venkite atgalinio skambučio pragaro (sudėkite kelis atgalinius skambučius). Vietoj to naudokite JavaScript pažadus.
  • Nesukurkite per daug klausytojų vienam įvykiui. Apsvarstykite galimybę padalinti įvykius ir sujungti juos grandinėmis.

Kurkite programas naudodami tinkamą architektūrą

Bendra taisyklė, taikoma kuriant programinę įrangą, yra priimti tinkamus architektūros ir dizaino sprendimus. Jei laikysitės netinkamo požiūrio kurdami programą, galiausiai susidursite su pasekmėmis.

Įvykiais pagrįstas programavimas yra paradigma, kuri gali turėti didelės įtakos programos architektūrai ir veikimui. Kai jūsų programa ar jos dalis priklauso nuo įvykių, turėtumėte apsvarstyti įvykiais pagrįstą programavimą.