{"id":351,"date":"2021-04-20T21:41:41","date_gmt":"2021-04-20T19:41:41","guid":{"rendered":"http:\/\/spireng.sk\/?p=351"},"modified":"2025-02-23T09:50:56","modified_gmt":"2025-02-23T08:50:56","slug":"asynchronne-spravy-alebo-reactive-extension","status":"publish","type":"post","link":"https:\/\/spireng.sk\/en\/asynchronne-spravy-alebo-reactive-extension\/","title":{"rendered":"Asynchr\u00f3nne spr\u00e1vy alebo Reactive Extension"},"content":{"rendered":"<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"200\" height=\"200\" src=\"http:\/\/spireng.sk\/wp-content\/uploads\/2021\/04\/re.png\" alt=\"\" class=\"wp-image-353\" srcset=\"https:\/\/spireng.sk\/wp-content\/uploads\/2021\/04\/re.png 200w, https:\/\/spireng.sk\/wp-content\/uploads\/2021\/04\/re-150x150.png 150w\" sizes=\"auto, (max-width: 200px) 100vw, 200px\" \/><\/figure><\/div>\n\n\n\n<p>Asynchr\u00f3nne programovanie je dnes\nu\u017e be\u017en\u00e1 vec. Mno\u017estvo spracovan\u00fdch \u00fadajov sa zv\u00e4\u010d\u0161uje. \u010cas na ich spracovanie\nm\u00e1 by\u0165 \u010do najkrat\u0161\u00ed. Z\u00e1rove\u0148 je u\u017e dnes komunik\u00e1cia po sieti \u00faplne be\u017en\u00e1,\na&nbsp;to je jedno z&nbsp;naj\u010dastej\u0161\u00edch asynchr\u00f3nnych oper\u00e1ci\u00ed v\u00f4bec. Bola len\not\u00e1zka \u010dasu ne\u017e sa za\u010dn\u00fa objavova\u0165 met\u00f3dy, kni\u017enice a&nbsp;frameworky, ktor\u00e9\nbud\u00fa bra\u0165 asynchr\u00f3nne programovanie ako z\u00e1klad ich fungovania. Jednou\nz&nbsp;tak\u00fdch je aj Reactive Extension.<\/p>\n\n\n\n<p>Reactive Extension (RE) nie je n\u00e1zov kni\u017enice, n\u00e1stroja alebo frameworku. Nie je to ani \u0161tandard. Je to pojem, ktor\u00fd pomenov\u00e1va sp\u00f4sob pr\u00e1ce s\u00a0asynchr\u00f3nnymi spr\u00e1vami. Ak sa pok\u00fasite n\u00e1js\u0165 na internete defin\u00edciu, tak zist\u00edte, \u017ee ich je nieko\u013eko, ale v\u00a0z\u00e1sade sa pohybuj\u00fa okolo toho ist\u00e9ho. Zjednodu\u0161ene by sa dalo poveda\u0165, \u017ee RE je<\/p>\n\n\n\n<p><strong> Model pr\u00e1ce s\u00a0asynchr\u00f3nnym spr\u00e1vami. <\/strong><\/p>\n\n\n\n<p>Ak by sme sa chceli trochu\nodviaza\u0165, tak m\u00f4\u017eeme poveda\u0165, \u017ee RE je:<\/p>\n\n\n\n<p><strong>Vzor Observer na stereoidoch.<\/strong><\/p>\n\n\n\n<p>A&nbsp;takto by sme sa mohli\npok\u00fa\u0161a\u0165 \u010falej zadefinova\u0165, \u010do to RE je, ale lep\u0161ie ako nieko\u013eko defin\u00edci\u00ed je\nuk\u00e1za\u0165 si to.<\/p>\n\n\n\n<p>RE bolo implementovan\u00e9 do\nnieko\u013ek\u00fdch kni\u017en\u00edc pre r\u00f4zne jazyky, pri\u010dom ich zoznam sa d\u00e1 n\u00e1js\u0165 na <a href=\"https:\/\/github.com\/Reactive-Extensions\">GitHube<\/a>. Z\u00e1kladn\u00fd princ\u00edp je\npre v\u0161etky ale rovnak\u00fd, preto je jedno, \u010di si napr\u00edklad zvol\u00edte RxJS alebo\nRxJava.<\/p>\n\n\n\n<p>Na za\u010diatok kr\u00e1tky \u00favod do Observer\nn\u00e1vrhov\u00e9ho vzoru. Observer (alebo slovensky Pozorovate\u013e) je vzor, ktor\u00e9ho\nhlavn\u00fdm \u00fa\u010delom je rozdistribuovanie udalosti medzi viacero prihl\u00e1sen\u00fdch\nklientov. Klient sa prihl\u00e1si na odber udalosti pre nejak\u00fa t\u00e9mu, a&nbsp;v\u017edy ke\u010f\nd\u00f4jde k&nbsp;takejto udalosti, tak je o&nbsp;tom notifikovan\u00fd. Toto je\nv&nbsp;podstate z\u00e1kladn\u00fd princ\u00edp RE.<\/p>\n\n\n\n<p>V\u0161etko sa to\u010d\u00ed okolo rozhrania Observer\na Observable. Observer je rozhranie pre t\u00fa \u010das\u0165 k\u00f3du, ktor\u00e1 udalosti generuje. Na\ndruhej strane je k\u00f3d, ktor\u00fd udalosti konzumuje, a&nbsp;tomu je ur\u010den\u00e9 rozhranie\nObservable. S\u00fa to v&nbsp;podstate dve strany tej istej mince.<\/p>\n\n\n\n<p>Observable je rozhranie, ktor\u00e9ho hlavn\u00e1 met\u00f3da je subscribe. Cez \u0148u sa vie klient prihl\u00e1si\u0165 na odber udalost\u00ed k\u00a0danej t\u00e9me (jedna t\u00e9ma = jedno Observable rozhranie). V\u00a0RxJS (v ktorom budem ukazova\u0165 aj \u010fal\u0161ie pr\u00edklady) to m\u00f4\u017ee vyzera\u0165 takto:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">X.subscribe(() => {<br>    console.log('Event');<br>},<br>() => {<br>    console.log('Error');<br>}, <br>() => {<br>    console.log('Complete'); <br>}); <\/pre>\n\n\n\n<p>Do met\u00f3dy subscribe som ako prv\u00fd\nparameter poslal anonymn\u00fa met\u00f3du, ktor\u00e1 zaloguje do konzoly re\u0165azec Event. To\nje callback funkcia, ktor\u00e1 je volan\u00e1 pri ka\u017edej udalosti. Ako ste si ur\u010dite\nv\u0161imli, okrem nej som tam poslal \u010fal\u0161ie dve funkcie. T\u00e1 druh\u00e1 je reakcia na to,\nak d\u00f4jde na strane producenta udalost\u00ed k&nbsp;chybe (teda error callback\nfunkcia). A&nbsp;t\u00e1 posledn\u00e1 je funkcia volan\u00e1, ke\u010f observer ukon\u010d\u00ed generovanie\nudalosti (teda complete callback funkcia). To je jedna z&nbsp;odli\u0161nost\u00ed medzi\nRE a&nbsp;Observable vzorom \u2013 v&nbsp;RE Observer vie posiela\u0165 inform\u00e1ciu aj\no&nbsp;tom, \u017ee do\u0161lo k&nbsp;chybe alebo \u017ee skon\u010dil.<\/p>\n\n\n\n<p>Nikoho teda asi neprekvap\u00ed, \u017ee rozhranie Observera obsahuje tieto tri k\u013e\u00fa\u010dov\u00e9 met\u00f3dy:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">observer.onNext(...)<br> <br>observer.onError(...)<br> <br>observer.onCompleted(...) <\/pre>\n\n\n\n<p>T\u00fdmito met\u00f3dami na strane\nproducenta posielam d\u00e1ta, pri\u010dom framework sa n\u00e1sledne postar\u00e1, \u017ee callbacky\nklientov s\u00fa volan\u00e9.<\/p>\n\n\n\n<p>Zatia\u013e to nevyzer\u00e1 na \u017eiaden\nz\u00e1zrak. API pre producenta, API pre konzumenta, posielanie nejak\u00fdch \u00fadajov. \u010co\nteda RE e\u0161te dok\u00e1\u017ee:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>udalosti prich\u00e1dzaj\u00face cez subscribe s\u00fa ako sled\n(pr\u00fad) udalost\u00ed, ktor\u00fd viem filtrova\u0165, transformova\u0165 a akumulova\u0165<\/li><li>producent m\u00f4\u017ee by\u0165 lazy (cold) \u2013 t.j. jeho k\u00f3d\nsa spust\u00ed, len ke\u010f m\u00e1 nejak\u00e9ho konzumenta, \u010do m\u00f4\u017ee \u0161etri\u0165 syst\u00e9mov\u00e9 prostriedky<\/li><li>viem vytvori\u0165 objekt Subject, ktor\u00fd implementuje\nobe rozhrania (Observable aj Observer) naraz, a&nbsp;t\u00fdm napr\u00edklad vytvori\u0165 adapt\u00e9r\npre existuj\u00face Observable rozhranie, ktor\u00e9 sa nespr\u00e1va pod\u013ea mojich predst\u00e1v<\/li><li>viem sp\u00e1ja\u0165 v\u00fdsledky viacer\u00fdch nez\u00e1visl\u00fdch Observable\ndo jedn\u00e9ho pr\u00fadu udalosti alebo naopak rozde\u013eova\u0165 jeden pr\u00fad udalost\u00ed na\nviacero samostatn\u00fdch pod\u013ea podmienky<\/li><li>viem pracova\u0165 so&nbsp;Schedulermi, \u010do s\u00fa\nobjekty, ktor\u00e9 umo\u017e\u0148uj\u00fa nastavova\u0165 pr\u00fad udalost\u00ed v&nbsp;\u010dase, a&nbsp;tak riadi\u0165\nkonkuren\u010dnos\u0165 ich spracovania<\/li><li>a&nbsp;mnoho \u010fal\u0161\u00edch vec\u00ed &#8230;<\/li><\/ul>\n\n\n\n<p>RE je teda z\u00e1kladn\u00fd koncept,\nokolo ktor\u00e9ho sa nabalilo mnoho u\u017eito\u010dnej funkcionality. Pekn\u00e9 na tom je, \u017ee\nz\u00e1kladn\u00e1 my\u0161lienka ost\u00e1va jednoduch\u00e1, a&nbsp;tak sa d\u00e1 kni\u017enica ve\u013emi r\u00fdchlo\njednoducho pou\u017e\u00edva\u0165. A&nbsp;ke\u010f sa v&nbsp;nej \u010dlovek rozpozer\u00e1, je schopn\u00fd\nabsorbova\u0165 \u010fal\u0161ie zlo\u017eitej\u0161ie t\u00e9my. Druhou v\u00fdhodou je, \u017ee je implementovan\u00fd vo\nviacer\u00fdch jazykoch, a&nbsp;to z&nbsp;poh\u013eadu pou\u017e\u00edvate\u013ea rovnako. Ak sa ho teda\nnau\u010d\u00edte pou\u017e\u00edva\u0165 v&nbsp;jednom, tak ve\u013emi \u013eahko prejdete do in\u00e9ho jazyka.\n\nD\u00e1 sa poveda\u0165, \u017ee reakt\u00edvne programovanie sa u\u017e\nuchytilo v&nbsp;mainstreame tvorby softv\u00e9ru, a&nbsp;teda treba \u010daka\u0165, \u017ee r\u00f4zne\njeho formy tu s&nbsp;nami bud\u00fa nejak\u00fa dobu (samozrejme, len k\u00fdm nepr\u00edde nie\u010do\nlep\u0161ie). RE je jedna tak\u00e1to forma, ktor\u00e1 je \u013eahk\u00e1 na pou\u017eitie a&nbsp;pritom sp\u013a\u0148a\nhne\u010f nieko\u013eko po\u017eiadaviek kladen\u00fdch na reakt\u00edvne programovanie.\n\n\n\n<\/p>","protected":false},"excerpt":{"rendered":"<p>Asynchr\u00f3nne programovanie je dnes u\u017e be\u017en\u00e1 vec. Mno\u017estvo spracovan\u00fdch \u00fadajov sa zv\u00e4\u010d\u0161uje. \u010cas na ich spracovanie m\u00e1 by\u0165 \u010do najkrat\u0161\u00ed. Z\u00e1rove\u0148 je u\u017e dnes komunik\u00e1cia po sieti \u00faplne be\u017en\u00e1, a&nbsp;to je jedno z&nbsp;naj\u010dastej\u0161\u00edch asynchr\u00f3nnych oper\u00e1ci\u00ed v\u00f4bec. Bola len ot\u00e1zka \u010dasu ne\u017e sa za\u010dn\u00fa objavova\u0165 met\u00f3dy, kni\u017enice a&nbsp;frameworky, ktor\u00e9 bud\u00fa bra\u0165 asynchr\u00f3nne programovanie ako z\u00e1klad ich [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[],"class_list":["post-351","post","type-post","status-publish","format-standard","hentry","category-vyvoj-softveru"],"_links":{"self":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/351","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/comments?post=351"}],"version-history":[{"count":2,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/351\/revisions"}],"predecessor-version":[{"id":354,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/351\/revisions\/354"}],"wp:attachment":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/media?parent=351"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/categories?post=351"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/tags?post=351"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}