Sobytiya i EventEmitter
Kak Node pozvolyaet odnoy chasti programmy obyavit, chto chto-to proizoshlo, a drugim chastyam otreagirovat - ne znaya drug o druge.
EventEmitter - eto nebolshoy, no moshchnyy dvigatel, kotoryy delaet etot pattern dostupnym v vashem sobstvennom kode.
- sozdat
EventEmitteri registrirovat slushateley cherezon()ionce(), - zapuskat sobytiya cherez
emit()i peredavat dannye slushatelyam, - udalyat slushateley i ponimat osoboe sobytie
error, - ispolzovat sobytiya dlya razvyazki (decoupling) chastey prilozheniya, chtoby oni menyalis nezavisimo.
1. Myshlenie v terminah sobytiy
Vy uzhe vstrechali sobytiya, ne nazyvaya ih. Kogda vy pisali server.on('request', handler) dlya HTTP-servera ili stream.on('data', chunk => ...) pri chtenii fayla, vy slushali sobytiya, kotorye Node ispuskal dlya vas. Eta tema daet vam tu zhe mashineriyu, chtoby vashi sobstvennye obekty mogli obyavlyat o proishodyashchem.
Pri sobytiyno-orientirovannom dizayne kod, kotoryy zametil chto-to, ne vyzyvaet kod, kotoryy dolzhen otreagirovat. On prosto delaet obyavlenie - "polzovatel zaregistrirovalsya", "fayl skachan" - i idet dalshe. Kto zainteresovan, uzhe podpisan. Eto takzhe nazyvayut patternom publikaciya/podpiska (pub-sub) ili nablyudatel (observer).
Zachem eto nuzhno? Potomu chto eto derzhit komponenty slabo svyazannymi. Chast, sozdayushchaya polzovatelya, ne dolzhna znat, chto my takzhe otpravlyaem privetstvennoe pismo, obnovlyaem analitiku i progrevaem kesh. Zapihivanie vsego etogo v odnu funkciyu delaet ee dlinnoy, hrupkoy i trudnoy dlya testirovaniya. Ispuskanie odnogo sobytiya userRegistered pozvolyaet kazhdoy zadache zhit v svoem slushatele.