{"id":36774,"date":"2019-10-31T22:13:44","date_gmt":"2019-10-31T19:13:44","guid":{"rendered":"https:\/\/prohoster.info\/blog\/asinhronnoe-programmirovanie-v-javascript-callback-promise-rxjs\/"},"modified":"2019-10-31T22:13:44","modified_gmt":"2019-10-31T19:13:44","slug":"asinhronnoe-programmirovanie-v-javascript-callback-promise-rxjs","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sk\/blog\/news\/asinhronnoe-programmirovanie-v-javascript-callback-promise-rxjs","title":{"rendered":"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ahoj v\u0161etci. Tu je Omelnytskyi Serhii. Ned\u00e1vno som mal live stream o reakt\u00edvnom programovan\u00ed, kde som rozpr\u00e1val o asynchr\u00f3nnosti v JavaScripte. Dnes by som chcel zhrn\u00fa\u0165 tento materi\u00e1l. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/11acf6af8328d3deb6f0ce48e813efb7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ale predt\u00fdm, ako za\u010dneme s hlavn\u00fdm materi\u00e1lom, mus\u00edme urobi\u0165 \u00favod. Po\u010fme si teda najprv definova\u0165, \u010do je z\u00e1sobn\u00edk a fronta?<br \/>\n<strong>Z\u00e1sobn\u00edk <\/strong>je kolekcia, z ktorej s\u00fa prvky vyberan\u00e9 pod\u013ea princ\u00edpu \u201eposledn\u00fd dodal, prv\u00fd vytiahnut\u00fd\u201c LIFO.<br \/>\n<strong>Fronta <\/strong>je kolekcia, z ktorej s\u00fa prvky vyberan\u00e9 pod\u013ea princ\u00edpu \u201eprv\u00fd dodal, prv\u00fd vytiahnut\u00fd\u201c FIFO.<\/p>\n<p><\/p>\n<p>Dobre, pokra\u010dujeme. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/a7d64d1c74f37b463869dd57b96c9d0e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>JavaScript je jednoprev\u00e1dzkov\u00fd programovac\u00ed jazyk. To znamen\u00e1, \u017ee m\u00e1 iba jeden tok vykon\u00e1vania a jeden z\u00e1sobn\u00edk, do ktor\u00e9ho s\u00fa funkcie umiest\u0148ovan\u00e9 na vykonanie. Preto m\u00f4\u017ee JavaScript v jeden moment vykona\u0165 iba jednu oper\u00e1ciu, ostatn\u00e9 oper\u00e1cie bud\u00fa \u010daka\u0165 na svoju rad v z\u00e1sobn\u00edku, k\u00fdm nebud\u00fa vyvolan\u00e9. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><strong>Z\u00e1sobn\u00edk volan\u00ed<\/strong> je \u0161trukt\u00fara \u00fadajov, ktor\u00e1, zjednodu\u0161ene povedan\u00e9, zaznamen\u00e1va inform\u00e1cie o tom, kde sa nach\u00e1dzame v programe. Ke\u010f prech\u00e1dzame do funkcie, prid\u00e1me z\u00e1znam o nej na vrchol z\u00e1sobn\u00edka. Ke\u010f sa vraciame z funkcie, vytiahneme z najvrchnej\u0161ieho prvku z\u00e1sobn\u00edka a ocitneme sa tam, odkia\u013e sme t\u00fato funkciu volali. To je v\u0161etko, \u010do z\u00e1sobn\u00edk dok\u00e1\u017ee. A teraz ve\u013emi zauj\u00edmav\u00e1 ot\u00e1zka. Ako teda funguje asynchr\u00f3nnos\u0165 v JavaScript-e?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/a29fd1dd3de06fb203c7dd14bda30548.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>V skuto\u010dnosti okrem z\u00e1sobn\u00edka existuje v prehliada\u010doch \u0161peci\u00e1lna fronta na pr\u00e1cu s takzvan\u00fdm WebAPI. Funkcie z tejto fronty sa vykonaj\u00fa postupne a\u017e po \u00faplnom vy\u010disten\u00ed z\u00e1sobn\u00edka. A\u017e potom s\u00fa presunut\u00e9 z fronty do z\u00e1sobn\u00edka na vykonanie. Ak je v z\u00e1sobn\u00edku aspo\u0148 jeden prvok, funkcie nem\u00f4\u017eu vst\u00fapi\u0165 do z\u00e1sobn\u00edka. Presne z tohto d\u00f4vodu je vyvolanie funkci\u00ed po timeout-e \u010dasto \u010dasovo nepresn\u00e9, preto\u017ee funkcia nem\u00f4\u017ee vst\u00fapi\u0165 z fronty do z\u00e1sobn\u00edka, k\u00fdm je ten pln\u00fd. <\/p>\n<p><\/p>\n<p>Pozrime sa na nasleduj\u00faci pr\u00edklad a zaobera\u0165 sa jeho krokov\u00fdm \u201evykonan\u00edm\u201c. Taktie\u017e presk\u00famame, \u010do sa dej\u00fa v syst\u00e9me.<\/p>\n<p><\/p>\n<pre><code class=\"javascript\">console.log('Hi);\nsetTimeout(function cb1() {\n    console.log('cb1');\n}, 5000);\nconsole.log('Bye');<\/code><\/pre>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/379423fca95fb28b2124be03dfd15739.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>1) Zatia\u013e sa ni\u010d nedeje. Konzola prehliada\u010da je pr\u00e1zdna, z\u00e1sobn\u00edk volan\u00ed je pr\u00e1zdny.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/4a16bbc23bade54ae0b02d81d5f6a581.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>2) Potom sa pr\u00edkaz console.log(\u2018Hi\u2019) prid\u00e1va do z\u00e1sobn\u00edka volan\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/a1845af23fd7dedebf94afc168f1f13f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>3) A on sa vykon\u00e1va<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/57397b53386018b662f3a79a6d4d60fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>4) Potom sa pr\u00edkaz console.log(\u2018Hi\u2019) odstra\u0148uje zo z\u00e1sobn\u00edka volan\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/7cb2b32be8807ecf39d2f38683ccd435.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>5) Teraz prech\u00e1dzame k pr\u00edkazu setTimeout(function cb1() {\u2026 }). Ten sa prid\u00e1va do z\u00e1sobn\u00edka volan\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/99c0724994e3390d009577852b451beb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>6) Pr\u00edkaz setTimeout(function cb1() {\u2026 }) sa vykon\u00e1va. Prehliada\u010d vytv\u00e1ra \u010dasova\u010d, ktor\u00fd je s\u00fa\u010das\u0165ou Web API. Ten za\u010dne odpo\u010d\u00edtava\u0165 \u010das.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/99086cdeafd83c5fe72e92c4a9f9b738.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>7) Pr\u00edkaz setTimeout(function cb1() {\u2026 }) ukon\u010dil svoju pr\u00e1cu a odstr\u00e1ni sa z z\u00e1sobn\u00edka volan\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/24ac12b1b6cfbff780ece9e9a7acd7c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>8) Pr\u00edkaz console.log(\u2018Bye\u2019) sa prid\u00e1va do z\u00e1sobn\u00edka volan\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/6ccad0ad8eebf05e870a409766d38766.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>9) Pr\u00edkaz console.log(\u2018Bye\u2019) sa vykon\u00e1va.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/09e4e380eb873fb23bea550f3ffb21f7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>10) Pr\u00edkaz console.log(\u2018Bye\u2019) sa odstra\u0148uje zo z\u00e1sobn\u00edka volan\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/357bfb372361310681ba7bb1860d90d7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>11) Ke\u010f uplyn\u00fa minim\u00e1lne 5000 ms, \u010dasova\u010d ukon\u010d\u00ed svoju pr\u00e1cu a umiestni kolbek cb1 do fronty kolbekov.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/8170e8ff5d3d0c56c0091658370c25cc.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>12) Cykel udalost\u00ed zoberie funkciu cb1 z fronty kolbekov a umiestni ju do z\u00e1sobn\u00edka volan\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/d858a54e82bc32d84f854610db462bc1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>13) Funkcia cb1 sa vykon\u00e1va a prid\u00e1va pr\u00edkaz console.log(\u2018cb1\u2019) do z\u00e1sobn\u00edka volan\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/6ca8e016389904eec57035e64d57a157.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>14) Pr\u00edkaz console.log(\u2018cb1\u2019) sa vykon\u00e1va.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/0caa645a90ac1fca5fb8a76569494d48.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>15) Pr\u00edkaz console.log(\u2018cb1\u2019) sa odstra\u0148uje zo z\u00e1sobn\u00edka volan\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/aeb838fe8df3f6e3f8603a4207a6e193.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>16) Funkcia cb1 sa odstr\u00e1ni zo z\u00e1sobn\u00edka volan\u00ed.<\/p>\n<p><\/p>\n<p>Pozrime sa na pr\u00edklad v dynamike:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/3836d9df513afee374f498720990e39f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tak sme si pre\u0161li, ako je v JavaScripte implementovan\u00e1 asynchr\u00f3nnos\u0165. Teraz si stru\u010dne po\u010fme pop\u00eds\u0165 evol\u00faciu asynchr\u00f3nneho k\u00f3du.<\/p>\n<p><\/p>\n<h2 id=\"evolyuciya-asinhronnogo-koda\">Evol\u00facia asynchr\u00f3nneho k\u00f3du.<\/h2>\n<p><\/p>\n<pre><code class=\"javascript\">a(function (resultsFromA) {\n    b(resultsFromA, function (resultsFromB) {\n        c(resultsFromB, function (resultsFromC) {\n            d(resultsFromC, function (resultsFromD) {\n                e(resultsFromD, function (resultsFromE) {\n                    f(resultsFromE, function (resultsFromF) {\n                        console.log(resultsFromF);\n                    })\n                })\n            })\n        })\n    })\n});<\/code><\/pre>\n<p><\/p>\n<p>Asynchr\u00f3nne programovanie, ak\u00e9 pozn\u00e1me v JavaScripte, m\u00f4\u017ee by\u0165 realizovan\u00e9 iba pomocou funkci\u00ed. M\u00f4\u017eu by\u0165 pren\u00e1\u0161an\u00e9 ako ak\u00e1ko\u013evek in\u00e1 premenn\u00e1 in\u00fdm funkci\u00e1m. Tak sa zrodili kolbky. A je to fajn, z\u00e1bavn\u00e9 a vzru\u0161uj\u00face, k\u00fdm sa to nepretransformuje na sm\u00fatenie a z\u00fafalstvo. Pre\u010do? Je to jednoduch\u00e9:<\/p>\n<p><\/p>\n<ul>\n<li>S rastom zlo\u017eitosti k\u00f3du sa projekt r\u00fdchlo men\u00ed na \u0165a\u017eko zrozumite\u013en\u00e9 viacn\u00e1sobne vnoren\u00e9 bloky \u2014 \u201ecallback hell\u201c.<\/li>\n<li>Spracovanie ch\u00fdb je \u013eahk\u00e9 prehliadnu\u0165.<\/li>\n<li>Nem\u00f4\u017eete vraca\u0165 v\u00fdrazy pomocou return.<\/li>\n<\/ul>\n<p><\/p>\n<p>S pr\u00edchodom Promise sa situ\u00e1cia o nie\u010do zlep\u0161ila.<\/p>\n<p><\/p>\n<pre><code class=\"javascript\">new Promise(function(resolve, reject) {\n    setTimeout(() =&gt; resolve(1), 2000);\n\n}).then((result) =&gt; {\n    alert(result);\n    return result + 2;\n\n}).then((result) =&gt; {\n    throw new Error('FAILED HERE');\n    alert(result);\n    return result + 2;\n\n}).then((result) =&gt; {\n    alert(result);\n    return result + 2;\n\n}).catch((e) =&gt; {\n    console.log('error: ', e);\n});<\/code><\/pre>\n<p><\/p>\n<ul>\n<li>Objavili sa re\u0165azce prom\u00edsov, \u010do zlep\u0161ilo \u010ditate\u013enos\u0165 k\u00f3du.<\/li>\n<li>Objavila sa samostatn\u00e1 met\u00f3da na zachyt\u00e1vanie ch\u00fdb.<\/li>\n<li>Objavila sa mo\u017enos\u0165 paraleln\u00e9ho vykon\u00e1vania pomocou Promise.all<\/li>\n<li>Vlo\u017een\u00fa asynchr\u00f3nnos\u0165 m\u00f4\u017eeme vyrie\u0161i\u0165 pomocou async\/await<\/li>\n<\/ul>\n<p><\/p>\n<p>Ale s promismi s\u00fa spojen\u00e9 ist\u00e9 obmedzenia. Napr\u00edklad, promisi bez \u201etanec s bubnom\u201c nemo\u017eno zru\u0161i\u0165, a \u010do je najd\u00f4le\u017eitej\u0161ie \u2014 pracuje s jednou hodnotou.<\/p>\n<p><\/p>\n<p>Tak a sme pomaly pre\u0161li k reakt\u00edvnemu programovaniu. U\u017e v\u00e1s to unavuje? Na\u0161\u0165astie si m\u00f4\u017eete \u00eds\u0165 uvari\u0165 \u010daj, premyslie\u0165 a vr\u00e1ti\u0165 sa \u010d\u00edta\u0165 \u010falej. Ja pokra\u010dujem.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/48409ec625d57fec171214c1de332c85.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Reakt\u00edvne programovanie<\/strong>\u2014 paradigma programovania zameran\u00e1 na toky d\u00e1t a \u0161\u00edrenie zmien. Po\u010fme sa podrobnej\u0161ie pozrie\u0165 na to, \u010do je tok d\u00e1t.<\/p>\n<p><\/p>\n<pre><code class=\"javascript\">\/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\nconst input = ducument.querySelector('input');\n\nconst eventsArray = [];\n\n\/\/ \u041f\u0443\u0448\u0438\u043c \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 eventsArray\ninput.addEventListener('keyup',\n    event =&gt; eventsArray.push(event)\n);<\/code><\/pre>\n<p><\/p>\n<p>Predstavme si, \u017ee m\u00e1me vstupn\u00e9 pole. Vytvor\u00edme pole a na ka\u017ed\u00e9 udalosti keyup vstupu budeme uklada\u0165 udalos\u0165 do n\u00e1\u0161ho po\u013ea. Pri tom by sme chceli poznamena\u0165, \u017ee na\u0161e pole je usporiadan\u00e9 pod\u013ea \u010dasu \u2014 t.j. index neskor\u0161\u00edch udalost\u00ed je v\u00e4\u010d\u0161\u00ed ne\u017e index sk\u00f4r udalost\u00ed. Tak\u00e9to pole predstavuje zjednodu\u0161en\u00fd model toku d\u00e1t, ale to e\u0161te nie je tok. Aby sme mohli toto pole smelo nazva\u0165 tokom, mus\u00ed vedie\u0165 nejak\u00fdm sp\u00f4sobom informova\u0165 predplatite\u013eov, \u017ee do\u0148 pri\u0161li nov\u00e9 d\u00e1ta. Takto sme sa dostali k defin\u00edcii toku.<\/p>\n<p><\/p>\n<h3 id=\"potok-dannyh\">Tok d\u00e1t<\/h3>\n<p><\/p>\n<pre><code class=\"javascript\">const { interval1 } = Rx;\nconst { take } = RxOperators;\n\ninterval(1000).pipe(\n    take(4)\n)<\/code><\/pre>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/68ec447abafb6b8a323b429ed94f8252.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Tok<\/strong>\u2014 je pole d\u00e1t usporiadan\u00fdch pod\u013ea \u010dasu, ktor\u00e9 m\u00f4\u017ee informova\u0165 o tom, \u017ee sa d\u00e1ta zmenili. A teraz si predstavte, ak\u00e9 pohodln\u00e9 je p\u00edsa\u0165 k\u00f3d, v ktorom na jedno akciu potrebujete vyvola\u0165 nieko\u013eko udalost\u00ed na r\u00f4znych miestach k\u00f3du. Jednoducho sa prihl\u00e1sime na tok a on n\u00e1m s\u00e1m ozn\u00e1mi, kedy d\u00f4jde k zmen\u00e1m. A toto dok\u00e1\u017ee kni\u017enica RxJs.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/dcb1cfca8b4d8a887b63c302a7d6c06a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>RxJS <\/strong> \u2014 je kni\u017enica na pr\u00e1cu s asynchr\u00f3nnymi a na udalostiach zalo\u017een\u00fdmi programami s pou\u017eit\u00edm pozorovate\u013en\u00fdch sekvenci\u00ed. Kni\u017enica poskytuje z\u00e1kladn\u00fd typ <em>Observable<\/em>, nieko\u013eko pomocn\u00fdch typov (<em>Observer, Schedulers, Subjects<\/em>) a oper\u00e1tory na pr\u00e1cu s udalos\u0165ami ako s kolekciami (<em>map, filter, reduce, every<\/em> a podobn\u00e9 z JavaScript Array).<\/p>\n<p><\/p>\n<p>Po\u010fme sa pozrie\u0165 na z\u00e1kladn\u00e9 pojmy tejto kni\u017enice.<\/p>\n<p><\/p>\n<h3 id=\"observable-observer-producer\">Observable, Observer, Producer<\/h3>\n<p><\/p>\n<p>Observable \u2014 prv\u00fd z\u00e1kladn\u00fd typ, ktor\u00fd presk\u00famame. Tento trieda obsahuje hlavn\u00fa \u010das\u0165 implement\u00e1cie RxJs. Je spojen\u00fd s pozorovate\u013en\u00fdm pr\u00fadom, na ktor\u00fd sa d\u00e1 prihl\u00e1si\u0165 pomocou met\u00f3dy subscribe.<\/p>\n<p><\/p>\n<p>V Observable sa realizuje pomocn\u00fd mechanizmus na vytv\u00e1ranie aktualiz\u00e1ci\u00ed, takzvan\u00fd <em>Observer<\/em>. Zdrojom hodn\u00f4t pre Observer sa naz\u00fdva <em>Producer<\/em>. M\u00f4\u017ee to by\u0165 pole, iter\u00e1tor, web socket, nejak\u00e1 udalos\u0165 at\u010f. Tak\u017ee sa d\u00e1 poveda\u0165, \u017ee observable je vodi\u010d medzi Producer a Observer. <\/p>\n<p><\/p>\n<p>Observable spracov\u00e1va tri druhy udalost\u00ed Observer:<\/p>\n<p><\/p>\n<ul>\n<li>next \u2013 nov\u00e9 \u00fadaje<\/li>\n<li>error \u2013 chyba, ak sekvencia skon\u010dila kv\u00f4li v\u00fdnimke. T\u00e1to udalos\u0165 tie\u017e znamen\u00e1 ukon\u010denie sekvencie.<\/li>\n<li>complete \u2014 sign\u00e1l o ukon\u010den\u00ed sekvencie. To znamen\u00e1, \u017ee nebud\u00fa \u017eiadne nov\u00e9 \u00fadaje.<\/li>\n<\/ul>\n<p><\/p>\n<p>Pozrime sa na demo:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/c5bcd2af0f18b6de3ab0dbc20db595d1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Na za\u010diatku spracujeme hodnoty 1, 2, 3, a po 1 sekunde dostaneme 4 a ukon\u010d\u00edme n\u00e1\u0161 pr\u00fad.<\/p>\n<p>\n<b class=\"spoiler_title\">My\u0161lienky nahlas<\/b><\/p>\n<p>A tu som si uvedomil, \u017ee rozpr\u00e1vanie bolo zauj\u00edmavej\u0161ie ako p\u00edsanie o tom. \ud83d\ude00 <\/p>\n<p><\/p>\n<h3 id=\"subscription\">Subscription<\/h3>\n<p><\/p>\n<p>Ke\u010f sa prihl\u00e1sime do pr\u00fadu, vytvor\u00edme nov\u00fa triedu <strong>subscription<\/strong>, ktor\u00e1 n\u00e1m umo\u017e\u0148uje zru\u0161i\u0165 prihl\u00e1senie pomocou met\u00f3dy <em>unsubscribe<\/em>. Takisto m\u00f4\u017eeme skupinova\u0165 prihl\u00e1senia pomocou met\u00f3dy <em>add<\/em>. A logicky m\u00f4\u017eeme rozgrupova\u0165 pr\u00fady pomocou <em>remove<\/em>. Met\u00f3dy add a remove prij\u00edmaj\u00fa in\u00fa prihl\u00e1\u0161ku. Chcel by som poznamena\u0165, \u017ee ke\u010f rob\u00edme odhl\u00e1senie, odhlasujeme sa od v\u0161etk\u00fdch podriaden\u00fdch prihl\u00e1sen\u00ed, akoby sme pre nich vyvol\u00e1vali met\u00f3du unsubscribe. Ideme \u010falej.<\/p>\n<p><\/p>\n<h3 id=\"vidy-potokov\">Druhy pr\u00fadov<\/h3>\n<p><\/p>\n<table>\n<thead>\n<tr>\n<th>HOT<\/th>\n<th>COLD<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Producer sa vytv\u00e1ra zvonku observable<\/td>\n<td>Producer sa vytv\u00e1ra vo vn\u00fatri observable<\/td>\n<\/tr>\n<tr>\n<td>\u00dadaje sa pren\u00e1\u0161aj\u00fa v \u010dase vytv\u00e1rania observable<\/td>\n<td>\u00dadaje sa ozn\u00e1mia v okamihu prihl\u00e1senia<\/td>\n<\/tr>\n<tr>\n<td>Potrebn\u00e1 je \u010fal\u0161ia logika na odhl\u00e1senie<\/td>\n<td>Pr\u00fad sa kon\u010d\u00ed s\u00e1m<\/td>\n<\/tr>\n<tr>\n<td>Pou\u017e\u00edva spojenie jeden-k-mnoh\u00fdm<\/td>\n<td>Pou\u017e\u00edva spojenie typu jeden-k-jedn\u00e9mu<\/td>\n<\/tr>\n<tr>\n<td>V\u0161etky prihl\u00e1senia maj\u00fa rovnak\u00fa hodnotu<\/td>\n<td>Prihl\u00e1senia s\u00fa nez\u00e1visl\u00e9<\/td>\n<\/tr>\n<tr>\n<td>\u00dadaje m\u00f4\u017eu by\u0165 straten\u00e9, ak nie je prihl\u00e1senie<\/td>\n<td>Prevod\u00ed v\u0161etky hodnoty pr\u00fadu pre nov\u00fa prihl\u00e1\u0161ku<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><\/p>\n<p>Ak by som chcel uvies\u0165 anal\u00f3giu, predstavil by som si hor\u00faci pr\u00fad ako film v kine. V ktoromko\u013evek \u010dase pr\u00edde\u0161, od toho momentu za\u010dne\u0161 sledovanie. Studen\u00fd pr\u00fad by som prirovnal k hovoru na technick\u00fa podporu. Ka\u017ed\u00fd, kto zavol\u00e1, po\u010d\u00fava nahr\u00e1vku automatick\u00e9ho z\u00e1znamn\u00edka od za\u010diatku do konca, ale m\u00f4\u017ee\u0161 zlo\u017ei\u0165 telef\u00f3n pomocou unsubscribe.<\/p>\n<p><\/p>\n<p>R\u00e1d by som poznamenal, \u017ee existuj\u00fa aj takzvan\u00e9 tepl\u00e9 toky (tak\u00e9to ozna\u010denie som stretol ve\u013emi zriedkavo a len v zahrani\u010dn\u00fdch komunit\u00e1ch) \u2014 ide o tok, ktor\u00fd sa transformuje z chladn\u00e9ho toku na hor\u00faci. Vznik\u00e1 ot\u00e1zka \u2014 kde ho pou\u017ei\u0165)) Uvediem pr\u00edklad z praxe.<\/p>\n<p><\/p>\n<p>Pracujem s Angul\u00e1rom. Akt\u00edvne vyu\u017e\u00edva rxjs. Na z\u00edskanie \u00fadajov zo servera o\u010dak\u00e1vam chladn\u00fd tok a tento tok pou\u017e\u00edvam v \u0161abl\u00f3ne pomocou asyncPipe. Ak tento pipe pou\u017eijem nieko\u013ekokr\u00e1t, vr\u00e1tiac sa k defin\u00edcii chladn\u00e9ho toku, ka\u017ed\u00fd pipe bude \u017eiada\u0165 d\u00e1ta zo servera, \u010do je jemne povedan\u00e9 zvl\u00e1\u0161tne. A ak premen\u00edm chladn\u00fd tok na tepl\u00fd, po\u017eiadavka prebehne len raz.<\/p>\n<p><\/p>\n<p>Vlastne pochopenie druhov tokov je dos\u0165 zlo\u017eit\u00e9 pre za\u010diato\u010dn\u00edkov, ale d\u00f4le\u017eit\u00e9. <\/p>\n<p><\/p>\n<h3 id=\"operators\">Oper\u00e1tory<\/h3>\n<p><\/p>\n<pre><code class=\"javascript\">return this.http.get(`${environment.apiUrl}\/${this.apiUrl}\/trade_companies`)\n    .pipe(\n        tap(({ data }: TradeCompanyList) =&gt; this.companies$$.next(cloneDeep(data))),\n        map(({ data }: TradeCompanyList) =&gt; data)\n    );<\/code><\/pre>\n<p><\/p>\n<p>Mo\u017enosti pr\u00e1ce s tokmi n\u00e1m poskytuj\u00fa oper\u00e1tory. Pom\u00e1haj\u00fa kontrolova\u0165 udalosti, ktor\u00e9 prebiehaj\u00fa v Observable. Presk\u00famame nieko\u013eko najpopul\u00e1rnej\u0161\u00edch, podrobnej\u0161ie s oper\u00e1tormi sa m\u00f4\u017eete obozn\u00e1mi\u0165 prostredn\u00edctvom odkazov v u\u017eito\u010dn\u00fdch inform\u00e1ci\u00e1ch.<\/p>\n<p><\/p>\n<p><strong>Oper\u00e1tory \u2014 of<\/strong><\/p>\n<p><\/p>\n<p>Za\u010dneme so pomocn\u00fdm oper\u00e1torom of. Vytv\u00e1ra Observable na z\u00e1klade jednoduch\u00e9ho hodnoty.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/68f382447e306392b025867a9a1e88e7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Oper\u00e1tory \u2014 filter<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/24ac65fdb5ccc7f6301b3dfe49f1e804.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Oper\u00e1tor filtrovania filter, ako mo\u017eno pochopi\u0165 z n\u00e1zvu, filtruje sign\u00e1l toku. Ak oper\u00e1tor vracia pravdu, pos\u00fava \u010falej.<\/p>\n<p><\/p>\n<p><strong>Oper\u00e1tory \u2014 take<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/b3e7a2a2e03038d6fc250247ff4496a2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>take \u2014 Prij\u00edma hodnotu po\u010dtu emitovan\u00fdch hodn\u00f4t, po ktor\u00fdch ukon\u010duje tok.<\/p>\n<p><\/p>\n<p><strong>Oper\u00e1tory \u2014 debounceTime<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/add686e546a0b6169c38fb3b457da928.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>debounceTime \u2014 zahod\u00ed emitovan\u00e9 hodnoty, ktor\u00e9 sa dostan\u00fa do ur\u010dit\u00e9ho \u010dasov\u00e9ho intervalu medzi v\u00fdstupmi \u2014 po uplynut\u00ed \u010dasov\u00e9ho intervalu emitne posledn\u00fa hodnotu.<\/p>\n<p><\/p>\n<pre><code class=\"javascript\">const { Observable } = Rx;\nconst { debounceTime, take } = RxOperators;\n\nObservable.create((observer) =&gt; {\n  let i = 1;\n  observer.next(i++);\n  \/\/ Emitujeme hodnotu raz za 1000ms\n  setInterval(() =&gt; {\n    observer.next(i++)\n  }, 1000);\n\n  \/\/ Emitujeme hodnotu raz za 1500ms\n  setInterval(() =&gt; {\n    observer.next(i++)\n  }, 1500);\n}).pipe(\n  debounceTime(700),  \/\/ \u010cak\u00e1me 700ms na hodnoty sk\u00f4r, ako ich spracujeme\n  take(3)\n);  <\/code><\/pre>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/dbb690d6fea6c43c1f0a2bdabea57934.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Oper\u00e1tory \u2014 takeWhile<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/120d9fe6ddf5a60ddffc8742989b27ff.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Emitne hodnoty, pokia\u013e takeWhile nevr\u00e1ti false, po \u010dom sa odhl\u00e1si z toku.<\/p>\n<p><\/p>\n<pre><code class=\"javascript\">const { Observable } = Rx;\nconst { debounceTime, takeWhile } = RxOperators;\n\nObservable.create((observer) =&gt; {\n  let i = 1;\n  observer.next(i++);\n  \/\/ Emit value every 1000ms\n  setInterval(() =&gt; {\n    observer.next(i++)\n  }, 1000);\n}).pipe(\n  takeWhile( producer =&gt;  producer &lt; 5 )\n);  <\/code><\/pre>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/d2910d1bf9fab228acc9241fdbad3d4a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Oper\u00e1tory \u2014 combineLatest<\/strong><\/p>\n<p><\/p>\n<p>Kombinovan\u00fd oper\u00e1tor combineLatest je nie\u010do podobn\u00e9 ako promise.all. Spojuje nieko\u013eko proudov do jedn\u00e9ho. Akon\u00e1hle ka\u017ed\u00fd proud vykon\u00e1 aspo\u0148 jedno emitovanie, z\u00edskame posledn\u00e9 hodnoty z ka\u017ed\u00e9ho vo forme po\u013ea. \u010ealej, po ka\u017edom emitovan\u00ed z kombinovan\u00fdch proudov bude poskytova\u0165 nov\u00e9 hodnoty.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/c39bc0a8a736ed30ad147055110bbf55.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<pre><code class=\"javascript\">const { combineLatest, Observable } = Rx;\nconst { take } = RxOperators;\n\nconst observer_1 = Observable.create((observer) =&gt; {\n  let i = 1;\n  \/\/ Emit value every 1000ms\n  setInterval(() =&gt; {\n    observer.next('a: ' + i++);\n  }, 1000);\n});\n\nconst observer_2 = Observable.create((observer) =&gt; {\n  let i = 1;\n  \/\/ Emit value every 750ms\n  setInterval(() =&gt; {\n    observer.next('b: ' + i++);\n  }, 750);\n});\n\ncombineLatest(observer_1, observer_2).pipe(take(5));<\/code><\/pre>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/7fc35461f446987ef81302ff7c2ed5a8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Oper\u00e1tory \u2014 zip<\/strong><\/p>\n<p><\/p>\n<p>Zip \u010dak\u00e1 na hodnotu z ka\u017ed\u00e9ho proudu a vytvor\u00ed pole na z\u00e1klade t\u00fdchto hodn\u00f4t. Ak hodnota nepr\u00edde z niektor\u00e9ho proudu, skupina nebude vytvoren\u00e1.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/0be5ee0d2ec56bd2bc245b15d43d4cc1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<pre><code class=\"javascript\">const { zip, Observable } = Rx;\nconst { take } = RxOperators;\n\nconst observer_1 = Observable.create((observer) =&gt; {\n  let i = 1;\n  \/\/ Emit value every 1000ms\n  setInterval(() =&gt; {\n    observer.next('a: ' + i++);\n  }, 1000);\n});\n\nconst observer_2 = Observable.create((observer) =&gt; {\n  let i = 1;\n  \/\/ Emit value every 750ms\n  setInterval(() =&gt; {\n    observer.next('b: ' + i++);\n  }, 750);\n});\n\nconst observer_3 = Observable.create((observer) =&gt; {\n  let i = 1;\n  \/\/ Emit value every 500ms\n  setInterval(() =&gt; {\n    observer.next('c: ' + i++);\n  }, 500);\n});\n\nzip(observer_1, observer_2, observer_3).pipe(take(5));<\/code><\/pre>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/e2606bf8ea5f8a660699ebe896a27d80.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Oper\u00e1tory \u2014 forkJoin<\/strong><\/p>\n<p><\/p>\n<p>forkJoin tie\u017e sp\u00e1ja proudy, ale emitentuje hodnotu iba vtedy, ke\u010f s\u00fa v\u0161etky pr\u00fady dokon\u010den\u00e9 (complete).<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/6c430d7eeafbc8a7c1c228ddfe0e44b5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<pre><code class=\"javascript\">const { forkJoin, Observable } = Rx;\nconst { take } = RxOperators;\n\nconst observer_1 = Observable.create((observer) =&gt; {\n  let i = 1;\n  \/\/ Emit value every 1000ms\n  setInterval(() =&gt; {\n    observer.next('a: ' + i++);\n  }, 1000);\n}).pipe(take(3));\n\nconst observer_2 = Observable.create((observer) =&gt; {\n  let i = 1;\n  \/\/ Emit value every 750ms\n  setInterval(() =&gt; {\n    observer.next('b: ' + i++);\n  }, 750);\n}).pipe(take(5));\n\nconst observer_3 = Observable.create((observer) =&gt; {\n  let i = 1;\n  \/\/ Emit value every 500ms\n  setInterval(() =&gt; {\n    observer.next('c: ' + i++);\n  }, 500);\n}).pipe(take(4));\n\nforkJoin(observer_1, observer_2, observer_3);<\/code><\/pre>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/df110efc7ece46fc1d8da2d7693f75bb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Oper\u00e1tory \u2014 map<\/strong><\/p>\n<p><\/p>\n<p>Transforma\u010dn\u00fd oper\u00e1tor map men\u00ed hodnotu emitovania na nov\u00fa. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/2196ff9f82dd7aaeb00ab76475176d32.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<pre><code class=\"javascript\">const {  Observable } = Rx;\nconst { take, map } = RxOperators;\n\nObservable.create((observer) =&gt; {\n  let i = 1;\n  \/\/ Emit value every 1000ms\n  setInterval(() =&gt; {\n    observer.next(i++);\n  }, 1000);\n}).pipe(\n  map(x =&gt; x * 10),\n  take(3)\n);\n<\/code><\/pre>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/4e4ff3e2eb4acf69f16559c711a2e666.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Oper\u00e1tory \u2014 share, tap<\/strong><\/p>\n<p><\/p>\n<p>Oper\u00e1tor tap \u2014 umo\u017e\u0148uje vykon\u00e1va\u0165 ved\u013eaj\u0161ie efekty, teda ak\u00e9ko\u013evek akcie, ktor\u00e9 neovplyv\u0148uj\u00fa sekvenciu.<\/p>\n<p><\/p>\n<p>U\u017eito\u010dn\u00fd oper\u00e1tor share dok\u00e1\u017ee premeni\u0165 studen\u00fd tok na hor\u00faci. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchr\u00f3nne programovanie v JavaScripte. ( Callback, Promise, RxJs )\" src=\"\/wp-content\/uploads\/2019\/08\/c46e96420ed78d197ceef829ff74c82d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>S oper\u00e1tormi sme skon\u010dili. Prejdime k Subjectu.<\/p>\n<p>\n<b class=\"spoiler_title\">My\u0161lienky nahlas<\/b><\/p>\n<p>A tu som si \u0161iel uvari\u0165 \u010daj. Tieto pr\u00edklady ma unavili \ud83d\ude00<\/p>\n<p><\/p>\n<h2 id=\"semeystvo-subject-ov\">Rodina subject-ov<\/h2>\n<p><\/p>\n<p>Rodina subject-ov je jasn\u00fdm pr\u00edkladom hor\u00facich tokov. Tieto triedy s\u00fa ak\u00fdmsi hybridom, ktor\u00fd vystupuje s\u00fa\u010dasne ako observable a observer. Ke\u010f\u017ee subject je hor\u00faci tok, je potrebn\u00e9 sa od neho odhl\u00e1si\u0165. Z h\u013eadiska hlavn\u00fdch met\u00f3d s\u00fa to:<\/p>\n<p><\/p>\n<ul>\n<li>next \u2013 poslanie nov\u00fdch d\u00e1t do toku<\/li>\n<li>error \u2013 chyba a ukon\u010denie toku<\/li>\n<li>complete \u2013 ukon\u010denie toku<\/li>\n<li>subscribe \u2013 prihl\u00e1si\u0165 sa na tok<\/li>\n<li>unsubscribe \u2013 odhl\u00e1si\u0165 sa z toku<\/li>\n<li>asObservable \u2013 pretransformova\u0165 na pozorovate\u013ea<\/li>\n<li>toPromise \u2013 pretransformuje na promiss<\/li>\n<\/ul>\n<p><\/p>\n<p>Vy\u010dle\u0148uj\u00fa sa 4-5 typov subject-ov. <\/p>\n<p>\n<b class=\"spoiler_title\">My\u0161lienky nahlas<\/b><\/p>\n<p>Na streame som hovoril 4, ale zistil som, \u017ee pridali e\u0161te jeden. Ako sa hovor\u00ed, \u017ei a u\u010d sa.<\/p>\n<p><\/p>\n<p>Jednoduch\u00fd Subject <code>new Subject()<\/code>\u2013 najjednoduch\u0161\u00ed typ subject-ov. Vytv\u00e1ra sa bez parametrov. Pren\u00e1\u0161a hodnoty, ktor\u00e9 prich\u00e1dzaj\u00fa a\u017e po prihl\u00e1sen\u00ed.<\/p>\n<p><\/p>\n<p>BehaviorSubject <code>new BehaviorSubject( defaultData&lt;T&gt; )<\/code> \u2013 pod\u013ea m\u00f4jho n\u00e1zoru najroz\u0161\u00edrenej\u0161\u00ed typ subject-ov. Berie na vstup predvolen\u00fa hodnotu. V\u017edy si udr\u017euje d\u00e1ta z posledn\u00e9ho emitovania, ktor\u00e9 pren\u00e1\u0161a pri prihl\u00e1sen\u00ed. T\u00e1to trieda m\u00e1 tie\u017e u\u017eito\u010dn\u00fa met\u00f3du value, ktor\u00e1 vracia aktu\u00e1lnu hodnotu toku.<\/p>\n<p><\/p>\n<p>ReplaySubject <code>new ReplaySubject(bufferSize?: number, windowTime?: number)<\/code> \u2014 Volite\u013ene m\u00f4\u017ee prija\u0165 ako prv\u00fd argument ve\u013ekos\u0165 vyrovn\u00e1vacej pam\u00e4te hodn\u00f4t, ktor\u00e9 si bude uchov\u00e1va\u0165, a ako druh\u00fd \u010das, po\u010das ktor\u00e9ho potrebujeme zmeny.<\/p>\n<p><\/p>\n<p>AsyncSubject <code>new AsyncSubject()<\/code> \u2014 pri prihl\u00e1sen\u00ed sa ni\u010d nedeje a hodnota bude vr\u00e1ten\u00e1 iba pri complete. Bude vr\u00e1ten\u00e9 iba posledn\u00e9 hodnotenie toku.<\/p>\n<p><\/p>\n<p>WebSocketSubject <code>new WebSocketSubject(urlConfigOrSource: string | WebSocketSubjectConfig&lt;T&gt; | Observable&lt;T&gt;, destination?: Observer&lt;T&gt;)<\/code> \u2014 O \u0148om dokument\u00e1cia ml\u010d\u00ed a ja ho vid\u00edm po prv\u00fdkr\u00e1t. Kto vie, \u010do rob\u00ed, nap\u00ed\u0161te, dopln\u00edme.<\/p>\n<p><\/p>\n<p>Uf. No a to je v\u0161etko, \u010do som chcel dnes poveda\u0165. D\u00fafam, \u017ee tieto inform\u00e1cie boli u\u017eito\u010dn\u00e9. Samostatne sa m\u00f4\u017eete obozn\u00e1mi\u0165 so zoznamom literat\u00fary na karte u\u017eito\u010dn\u00e9 inform\u00e1cie.<\/p>\n<p><\/p>\n<h2 id=\"poleznaya-informaciya\">U\u017eito\u010dn\u00e9 inform\u00e1cie<\/h2>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/vk.com\/frontend_practice?w=wall-182297870_931\">https:\/\/vk.com\/frontend_practice?w=wall-182297870_931<\/a><\/noindex> \u2014 odkaz na stream<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/337042\/\">https:\/\/habr.com\/ru\/company\/ruvds\/blog\/337042\/<\/a><\/noindex> \u2014 Ako funguje JS: preh\u013ead enginu, mechanizmov runtime, z\u00e1sobn\u00edka volan\u00ed<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/340508\/\">https:\/\/habr.com\/ru\/company\/ruvds\/blog\/340508<\/a><\/noindex> \u2014 Ako funguje JS: cyklus udalost\u00ed, asynchronicita a p\u00e4\u0165 sp\u00f4sobov, ako zlep\u0161i\u0165 k\u00f3d pomocou async \/ await<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/vanilla-js.blogspot.com\/2014\/09\/event-loop-javasript.html\">http:\/\/vanilla-js.blogspot.com\/2014\/09\/event-loop-javasript.html<\/a><\/noindex> \u2014 Ako funguje Event Loop v JavaScripte<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/tproger.ru\/translations\/asynchronous-javascript\/\">https:\/\/tproger.ru\/translations\/asynchronous-javascript\/<\/a><\/noindex> \u2014 Evol\u00facia asynchr\u00f3nneho JavaScriptu<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/341880\/\">https:\/\/habr.com\/ru\/company\/ruvds\/blog\/341880\/<\/a><\/noindex> \u2014 \u010co je RxJS a pre\u010do je dobr\u00e9 o \u0148om vedie\u0165<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/ngx\/practical-use-rxjs-81aaab57045c\">https:\/\/medium.com\/ngx\/practical-use-rxjs-81aaab57045c<\/a><\/noindex> \u2014 Praktick\u00e9 vyu\u017eitie RxJS<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/coursetro.com\/posts\/code\/148\/RxJS-Observables-Tutorial---Creating-&amp;-Subscribing-to-Observables\">https:\/\/coursetro.com\/posts\/code\/148\/RxJS-Observables-Tutorial&#8212;Creating-&amp;-Subscribing-to-Observables<\/a><\/noindex> \u2014 RxJS Observables Tutorial \u2014 Creating &amp; Subscribing to Observables<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/slides.com\/zenabsaleem\/rxjs-hot-cold-observables#\/\">https:\/\/slides.com\/zenabsaleem\/rxjs-hot-cold-observables#\/<\/a><\/noindex> \u2014 RXJS: Hor\u00face a studen\u00e9 observables<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/clck.ru\/FiPgB\">https:\/\/clck.ru\/FiPgB<\/a><\/noindex> \u2014 Triedy a funkcie na vytvorenie Observable. Oper\u00e1tory.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.learnrxjs.io\/operators\/\">https:\/\/www.learnrxjs.io\/operators\/<\/a><\/noindex> \u2014 RxJS Oper\u00e1tory pod\u013ea pr\u00edkladov<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/rxjs.dev\/api\">https:\/\/rxjs.dev\/api<\/a><\/noindex> \u2014 API Zoznam<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/clck.ru\/FkS8Y\">https:\/\/clck.ru\/FkS8Y<\/a><\/noindex> \u2014 R\u00f4zne typy Subject a Rozvrhy v RxJS<\/li>\n<\/ul>\n<p>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/462355\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442. \u041d\u0430 \u0441\u0432\u044f\u0437\u0438 \u041e\u043c\u0435\u043b\u044c\u043d\u0438\u0446\u043a\u0438\u0439 \u0421\u0435\u0440\u0433\u0435\u0439. \u041d\u0435 \u0442\u0430\u043a \u0434\u0430\u0432\u043d\u043e \u044f \u0432\u0435\u043b \u0441\u0442\u0440\u0438\u043c \u043f\u043e \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e, \u0433\u0434\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u043f\u0440\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c \u0432 JavaScript. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0431\u044b \u0445\u043e\u0442\u0435\u043b \u0437\u0430\u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b. \u041d\u043e \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043a\u0430\u043a \u043d\u0430\u0447\u0430\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0432\u043e\u0434\u043d\u0443\u044e. \u0418\u0442\u0430\u043a, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0439: \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0441\u0442\u0435\u043a \u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c? \u0421\u0442\u0435\u043a \u2014 \u044d\u0442\u043e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f, \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u0442\u043e\u0440\u043e\u0439 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":27545,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-36774","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.5 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442. \u041d\u0430 \u0441\u0432\u044f\u0437\u0438 \u041e\u043c\u0435\u043b\u044c\u043d\u0438\u0446\u043a\u0438\u0439 \u0421\u0435\u0440\u0433\u0435\u0439. \u041d\u0435 \u0442\u0430\u043a \u0434\u0430\u0432\u043d\u043e \u044f \u0432\u0435\u043b \u0441\u0442\u0440\u0438\u043c \u043f\u043e \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e, \u0433\u0434\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u043f\u0440\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c \u0432 JavaScript. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0431\u044b \u0445\u043e\u0442\u0435\u043b \u0437\u0430\u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sk\/blog\/news\/asinhronnoe-programmirovanie-v-javascript-callback-promise-rxjs\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"sk_SK\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 JavaScript. ( Callback, Promise, RxJs ) | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442. \u041d\u0430 \u0441\u0432\u044f\u0437\u0438 \u041e\u043c\u0435\u043b\u044c\u043d\u0438\u0446\u043a\u0438\u0439 \u0421\u0435\u0440\u0433\u0435\u0439. \u041d\u0435 \u0442\u0430\u043a \u0434\u0430\u0432\u043d\u043e \u044f \u0432\u0435\u043b \u0441\u0442\u0440\u0438\u043c \u043f\u043e \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e, \u0433\u0434\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u043f\u0440\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c \u0432 JavaScript. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0431\u044b \u0445\u043e\u0442\u0435\u043b \u0437\u0430\u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sk\/blog\/news\/asinhronnoe-programmirovanie-v-javascript-callback-promise-rxjs\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:13:44+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:13:44+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Asynchr\u00f3nne programovanie v JavaScripte. (Callback, Promise, RxJs) | ProHoster","description":"Ahoj v\u0161etci. Tu je Omelnytskyi Serhii. Ned\u00e1vno som mal live stream o reakt\u00edvnom programovan\u00ed, kde som rozpr\u00e1val o asynchr\u00f3nnosti v JavaScripte. Dnes by som chcel zhrn\u00fa\u0165 tento materi\u00e1l.","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/news\/asinhronnoe-programmirovanie-v-javascript-callback-promise-rxjs","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 JavaScript. ( Callback, Promise, RxJs ) | ProHoster","og:description":"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442. \u041d\u0430 \u0441\u0432\u044f\u0437\u0438 \u041e\u043c\u0435\u043b\u044c\u043d\u0438\u0446\u043a\u0438\u0439 \u0421\u0435\u0440\u0433\u0435\u0439. \u041d\u0435 \u0442\u0430\u043a \u0434\u0430\u0432\u043d\u043e \u044f \u0432\u0435\u043b \u0441\u0442\u0440\u0438\u043c \u043f\u043e \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e, \u0433\u0434\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u043f\u0440\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c \u0432 JavaScript. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0431\u044b \u0445\u043e\u0442\u0435\u043b \u0437\u0430\u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b.","og:url":"https:\/\/prohoster.info\/sk\/blog\/news\/asinhronnoe-programmirovanie-v-javascript-callback-promise-rxjs","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:13:44+00:00","article:modified_time":"2019-10-31T19:13:44+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"36774","title":null,"description":null,"keywords":null,"keyphrases":{"focus":[],"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-22 04:48:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:39:22","updated":"2026-08-11 12:50:32","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/36774","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=36774"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/36774\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/27545"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=36774"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=36774"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=36774"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}