{"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\/cs\/blog\/news\/asinhronnoe-programmirovanie-v-javascript-callback-promise-rxjs","title":{"rendered":"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (Callback, Promise, RxJs)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ahoj v\u0161em. Tady je Sergej Omelnytsky. Ned\u00e1vno jsem vedl stream o reaktivn\u00edm programov\u00e1n\u00ed, kde jsem hovo\u0159il o asynchronnosti v JavaScriptu. Dnes bych cht\u011bl shrnout tento materi\u00e1l. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/11acf6af8328d3deb6f0ce48e813efb7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ale p\u0159edt\u00edm, ne\u017e za\u010dneme s hlavn\u00edm materi\u00e1lem, je pot\u0159eba ud\u011blat \u00favod. Tak poj\u010fme za\u010d\u00edt s definicemi: co je to z\u00e1sobn\u00edk a fronta?<br \/>\n<strong>Z\u00e1sobn\u00edk <\/strong>\u2014 to je kolekce, jej\u00ed\u017e prvky jsou vyb\u00edr\u00e1ny podle principu \u201eposledn\u00ed p\u0159i\u0161el, prvn\u00ed ode\u0161el\u201c LIFO.<br \/>\n<strong>Fronta <\/strong>\u2014 to je kolekce, jej\u00ed\u017e prvky jsou vyb\u00edr\u00e1ny podle principu \u201eprvn\u00ed p\u0159i\u0161el, prvn\u00ed ode\u0161el\u201c FIFO.<\/p>\n<p><\/p>\n<p>Dob\u0159e, pokra\u010dujme. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (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 jednoproduktov\u00fd programovac\u00ed jazyk. To znamen\u00e1, \u017ee m\u00e1 pouze jeden vykon\u00e1vac\u00ed vl\u00e1knov\u00fd tok a jeden z\u00e1sobn\u00edk, do kter\u00e9ho se funkce ukl\u00e1daj\u00ed do fronty k vykon\u00e1n\u00ed. Proto m\u016f\u017ee JavaScript v jeden okam\u017eik vykonat pouze jednu operaci, jin\u00e9 operace na to \u010dekaj\u00ed ve front\u011b, dokud nejsou vyvol\u00e1ny. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><strong>Z\u00e1sobn\u00edk vol\u00e1n\u00ed<\/strong> \u2014 to je datov\u00e1 struktura, kter\u00e1, zjednodu\u0161en\u011b \u0159e\u010deno, zapisuje informace o m\u00edst\u011b v programu, kde se nach\u00e1z\u00edme. Kdy\u017e p\u0159ejdeme do funkce, um\u00edst\u00edme z\u00e1znam o n\u00ed na vrchol z\u00e1sobn\u00edku. Kdy\u017e se z funkce vrac\u00edme, vyt\u00e1hneme z\u00e1znam z vrchn\u00ed \u010d\u00e1sti z\u00e1sobn\u00edku a ocitneme se tam, odkud byla tato funkce vyvol\u00e1na. To je v\u0161e, co z\u00e1sobn\u00edk d\u011bl\u00e1. A te\u010f vzru\u0161uj\u00edc\u00ed ot\u00e1zka. Jak tedy funguje asynchronnost v JavaScriptu?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/a29fd1dd3de06fb203c7dd14bda30548.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ve skute\u010dnosti, krom\u011b z\u00e1sobn\u00edku, maj\u00ed prohl\u00ed\u017ee\u010de speci\u00e1ln\u00ed frontu pro pr\u00e1ci s takzvan\u00fdm WebAPI. Funkce z t\u00e9to fronty se vykon\u00e1vaj\u00ed v po\u0159ad\u00ed, a\u017e kdy\u017e je z\u00e1sobn\u00edk \u00fapln\u011b vypr\u00e1zdn\u011bn. A\u017e pak jsou um\u00edst\u011bny do z\u00e1sobn\u00edku k vykon\u00e1n\u00ed. Pokud je v z\u00e1sobn\u00edku v sou\u010dasnosti alespo\u0148 jeden prvek, nemohou do z\u00e1sobn\u00edku vstoupit. Pr\u00e1v\u011b z tohoto d\u016fvodu b\u00fdv\u00e1 vol\u00e1n\u00ed funkc\u00ed pomoc\u00ed timeru \u010dasto \u010dasov\u011b nep\u0159esn\u00e9, proto\u017ee funkce nem\u016f\u017ee vstoupit do z\u00e1sobn\u00edku, dokud je ten pln\u00fd. <\/p>\n<p><\/p>\n<p>Pod\u00edvejme se na n\u00e1sleduj\u00edc\u00ed p\u0159\u00edklad a zab\u00fdvejme se jeho krokov\u00fdm \u201evykon\u00e1n\u00edm\u201c. Tak\u00e9 se pod\u00edvejme, co se v syst\u00e9mu sou\u010dasn\u011b d\u011bje.<\/p>\n<p><\/p>\n<pre><code class=\"javascript\">console.log('Ahoj');\nsetTimeout(function cb1() {\n    console.log('cb1');\n}, 5000);\nconsole.log('Ahoj');<\/code><\/pre>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/379423fca95fb28b2124be03dfd15739.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>1) Zat\u00edm se nic ned\u011bje. Konzole prohl\u00ed\u017ee\u010de je pr\u00e1zdn\u00e1, z\u00e1sobn\u00edk vol\u00e1n\u00ed je pr\u00e1zdn\u00fd.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/4a16bbc23bade54ae0b02d81d5f6a581.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>2) Pot\u00e9 se p\u0159\u00edkaz console.log('Ahoj') p\u0159id\u00e1 na z\u00e1sobn\u00edk vol\u00e1n\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (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 ona se prov\u00e1d\u00ed<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/57397b53386018b662f3a79a6d4d60fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>4) N\u00e1sledn\u011b se console.log('Ahoj') odstran\u00ed ze z\u00e1sobn\u00edku vol\u00e1n\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/7cb2b32be8807ecf39d2f38683ccd435.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>5) Nyn\u00ed p\u0159ejdeme k p\u0159\u00edkazu setTimeout(function cb1() {\u2026 }). Ten je p\u0159id\u00e1n do z\u00e1sobn\u00edku vol\u00e1n\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/99c0724994e3390d009577852b451beb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>6) P\u0159\u00edkaz setTimeout(function cb1() {\u2026 }) se prov\u00e1d\u00ed. Prohl\u00ed\u017ee\u010d vytvo\u0159\u00ed \u010dasova\u010d, kter\u00fd je sou\u010d\u00e1st\u00ed Web API. Bude prov\u00e1d\u011bt odpo\u010det.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/99086cdeafd83c5fe72e92c4a9f9b738.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>7) P\u0159\u00edkaz setTimeout(function cb1() {\u2026 }) dokon\u010dil svou \u010dinnost a je odstran\u011bn ze z\u00e1sobn\u00edku vol\u00e1n\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/24ac12b1b6cfbff780ece9e9a7acd7c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>8) P\u0159\u00edkaz console.log('Sbohem') se p\u0159id\u00e1 na z\u00e1sobn\u00edk vol\u00e1n\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/6ccad0ad8eebf05e870a409766d38766.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>9) P\u0159\u00edkaz console.log('Sbohem') se vykon\u00e1v\u00e1.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/09e4e380eb873fb23bea550f3ffb21f7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>10) P\u0159\u00edkaz console.log('Sbohem') se odstran\u00ed ze z\u00e1sobn\u00edku vol\u00e1n\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/357bfb372361310681ba7bb1860d90d7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>11) Jakmile uplyne alespo\u0148 5000 ms, \u010dasova\u010d dokon\u010d\u00ed svou \u010dinnost a um\u00edst\u00ed callback cb1 do fronty callback\u016f.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/8170e8ff5d3d0c56c0091658370c25cc.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>12) Cyklus ud\u00e1lost\u00ed vezme funkci cb1 z fronty callback\u016f a um\u00edst\u00ed ji do z\u00e1sobn\u00edku vol\u00e1n\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/d858a54e82bc32d84f854610db462bc1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>13) Funkce cb1 se vykon\u00e1v\u00e1 a p\u0159id\u00e1v\u00e1 console.log('cb1') na z\u00e1sobn\u00edk vol\u00e1n\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/6ca8e016389904eec57035e64d57a157.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>14) P\u0159\u00edkaz console.log('cb1') se vykon\u00e1v\u00e1.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/0caa645a90ac1fca5fb8a76569494d48.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>15) P\u0159\u00edkaz console.log('cb1') se odstran\u00ed ze z\u00e1sobn\u00edku vol\u00e1n\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/aeb838fe8df3f6e3f8603a4207a6e193.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>16) Funkce cb1 je odstran\u011bna ze z\u00e1sobn\u00edku vol\u00e1n\u00ed.<\/p>\n<p><\/p>\n<p>Pod\u00edvejme se na p\u0159\u00edklad v dynamice:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/3836d9df513afee374f498720990e39f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tak a m\u00e1me za sebou, jak je v JavaScriptu realizov\u00e1na asynchronnost. Te\u010f si stru\u010dn\u011b promluvme o evoluci asynchronn\u00edho k\u00f3du.<\/p>\n<p><\/p>\n<h2 id=\"evolyuciya-asinhronnogo-koda\">Evoluce asynchronn\u00edho 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>Asynchronn\u00ed programov\u00e1n\u00ed, jak ho zn\u00e1me v JavaScriptu, m\u016f\u017ee b\u00fdt realizov\u00e1no pouze pomoc\u00ed funkc\u00ed. Ty mohou b\u00fdt p\u0159ed\u00e1v\u00e1ny jako jak\u00e1koliv jin\u00e1 prom\u011bnn\u00e1 dal\u0161\u00edm funkc\u00edm. Tak se zrodily callbacky. A je to skv\u011bl\u00e9, z\u00e1bavn\u00e9 a vesel\u00e9, dokud se to neprom\u011bn\u00ed v smutek, l\u00edtost a z\u00e1rmutek. Pro\u010d? Odpov\u011b\u010f je jednoduch\u00e1:<\/p>\n<p><\/p>\n<ul>\n<li>S rostouc\u00ed slo\u017eitost\u00ed k\u00f3du se projekt rychle m\u011bn\u00ed v m\u00e1lo srozumiteln\u00e9 v\u00edcen\u00e1sobn\u011b vno\u0159en\u00e9 bloky \u2014 \u201ecallback hell\u201c.<\/li>\n<li>Zpracov\u00e1n\u00ed chyb lze snadno opomenout.<\/li>\n<li>Nen\u00ed mo\u017en\u00e9 vracet v\u00fdrazy pomoc\u00ed return.<\/li>\n<\/ul>\n<p><\/p>\n<p>Se vznikem Promise se situace o n\u011bco 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('TADY DO\u0160LO K CHYB\u011a');\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('chyba: ', e);\n});<\/code><\/pre>\n<p><\/p>\n<ul>\n<li>Objevily se \u0159et\u011bzce promiss\u016f, co\u017e zlep\u0161ilo \u010ditelnost k\u00f3du.<\/li>\n<li>Objevil se samostatn\u00fd metod pro zachycen\u00ed chyb.<\/li>\n<li>Objevila se mo\u017enost paraleln\u00edho zpracov\u00e1n\u00ed pomoc\u00ed Promise.all<\/li>\n<li>Vno\u0159enou asynchronnost m\u016f\u017eeme vy\u0159e\u0161it pomoc\u00ed async\/await<\/li>\n<\/ul>\n<p><\/p>\n<p>Ale m\u00e1 sv\u00e1 omezen\u00ed. Nap\u0159\u00edklad promisi nelze zru\u0161it bez zbyte\u010dn\u00fdch komplikac\u00ed, a co je nejd\u016fle\u017eit\u011bj\u0161\u00ed \u2013 pracuje s jednou hodnotou.<\/p>\n<p><\/p>\n<p>Tak jsme se pomalu dostali k reaktivn\u00edmu programov\u00e1n\u00ed. Jste unaven\u00ed? Na\u0161t\u011bst\u00ed si m\u016f\u017eete ud\u011blat \u010daj, promyslet to a vr\u00e1tit se k dal\u0161\u00edmu \u010dten\u00ed. J\u00e1 budu pokra\u010dovat.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/48409ec625d57fec171214c1de332c85.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Reaktivn\u00ed programov\u00e1n\u00ed<\/strong>\u200a\u2014\u200aparadigma programov\u00e1n\u00ed zam\u011b\u0159en\u00e1 na toky dat a \u0161\u00ed\u0159en\u00ed zm\u011bn. Poj\u010fme si podrobn\u011bji vysv\u011btlit, co znamen\u00e1 tok dat.<\/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>P\u0159edstavme si, \u017ee m\u00e1me pole pro vstup. Vytv\u00e1\u0159\u00edme pole a na ka\u017edou ud\u00e1lost keyup ze vstupu budeme ukl\u00e1dat ud\u00e1lost do na\u0161eho pole. R\u00e1di bychom poznamenali, \u017ee na\u0161e pole je se\u0159azeno podle \u010dasu, tedy index pozd\u011bj\u0161\u00edch ud\u00e1lost\u00ed je v\u011bt\u0161\u00ed ne\u017e index d\u0159\u00edv\u011bj\u0161\u00edch. Takov\u00e9 pole p\u0159edstavuje zjednodu\u0161enou model toku dat, ale zat\u00edm to nen\u00ed tok. Aby toto pole mohlo b\u00fdt ozna\u010deno jako tok, mus\u00ed m\u00edt n\u011bjak\u00fd zp\u016fsob, jak zas\u00edlat novinky odb\u011bratel\u016fm o nov\u00fdch datech. T\u00edmto jsme se dostali k definici toku.<\/p>\n<p><\/p>\n<h3 id=\"potok-dannyh\">Tok dat<\/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=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (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\u200a<\/strong>\u2014\u200ato je pole dat se\u0159azen\u00fdch podle \u010dasu, kter\u00e9 m\u016f\u017ee informovat o zm\u011bn\u00e1ch dat. A te\u010f si p\u0159edstavte, jak snadn\u00e9 je ps\u00e1t k\u00f3d, kde je pot\u0159eba vyvolat n\u011bkolik ud\u00e1lost\u00ed na r\u016fzn\u00fdch m\u00edstech k\u00f3du p\u0159i jedn\u00e9 akci. Jednodu\u0161e se p\u0159ihl\u00e1s\u00edme k toku a ten n\u00e1m s\u00e1m sd\u011bl\u00ed, kdy dojde ke zm\u011bn\u00e1m. A to zvl\u00e1d\u00e1 knihovna RxJs.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (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 knihovna pro pr\u00e1ci s asynchronn\u00edmi a ud\u00e1lostmi \u0159\u00edzen\u00fdmi programy pomoc\u00ed pozorovac\u00edch sekvenc\u00ed. Knihovna poskytuje z\u00e1kladn\u00ed typ <em>Observable<\/em>, n\u011bkolik pomocn\u00fdch typ\u016f (<em>Observer, Schedulers, Subjects<\/em>) a oper\u00e1tory pr\u00e1ce s ud\u00e1lostmi jako s kolekcemi (<em>map, filter, reduce, every<\/em> a podobn\u00e9 z JavaScript Array).<\/p>\n<p><\/p>\n<p>Poj\u010fme se zam\u011b\u0159it na z\u00e1kladn\u00ed pojmy t\u00e9to knihovny.<\/p>\n<p><\/p>\n<h3 id=\"observable-observer-producer\">Observable, Observer, Producer<\/h3>\n<p><\/p>\n<p>Observable je prvn\u00ed z\u00e1kladn\u00ed typ, kter\u00fd budeme zkoumat. Tato t\u0159\u00edda obsahuje hlavn\u00ed \u010d\u00e1st implementace RxJs. Je spojena s pozorovan\u00fdm tokem, na kter\u00fd se lze p\u0159ihl\u00e1sit pomoc\u00ed metody subscribe.<\/p>\n<p><\/p>\n<p>V Observable je implementov\u00e1n pomocn\u00fd mechanismus pro vytv\u00e1\u0159en\u00ed aktualizac\u00ed, takzvan\u00fd <em>Observer<\/em>. Zdrojem hodnot pro Observer je to, co se naz\u00fdv\u00e1 <em>Producent<\/em>. M\u016f\u017ee to b\u00fdt pole, iter\u00e1tor, web socket, n\u011bjak\u00e1 ud\u00e1lost atd. Lze tedy \u0159\u00edci, \u017ee observable je prost\u0159edn\u00edkem mezi Producer a Observer. <\/p>\n<p><\/p>\n<p>Observable zpracov\u00e1v\u00e1 t\u0159i typy ud\u00e1lost\u00ed Observer:<\/p>\n<p><\/p>\n<ul>\n<li>next \u2013 nov\u00e9 \u00fadaje<\/li>\n<li>error \u2013 chybu, pokud sekvence skon\u010dila z d\u016fvodu v\u00fdjime\u010dn\u00e9 situace. Tato ud\u00e1lost rovn\u011b\u017e p\u0159edpokl\u00e1d\u00e1 ukon\u010den\u00ed sekvence.<\/li>\n<li>complete \u2014 sign\u00e1l o dokon\u010den\u00ed sekvence. To znamen\u00e1, \u017ee ji\u017e nebudou \u017e\u00e1dn\u00e1 nov\u00e1 data.<\/li>\n<\/ul>\n<p><\/p>\n<p>Pod\u00edvejme se na demo:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (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\u010d\u00e1tku zpracujeme hodnoty 1, 2, 3 a po 1 sekunde z\u00edsk\u00e1me 4 a ukon\u010d\u00edme n\u00e1\u0161 tok.<\/p>\n<p>\n<b class=\"spoiler_title\">My\u0161lenky nahlas<\/b><\/p>\n<p>A tehdy jsem si uv\u011bdomil, \u017ee vypr\u00e1v\u011bn\u00ed bylo zaj\u00edmav\u011bj\u0161\u00ed ne\u017e o tom ps\u00e1t. \ud83d\ude00 <\/p>\n<p><\/p>\n<h3 id=\"subscription\">Subscription<\/h3>\n<p><\/p>\n<p>Kdy\u017e se p\u0159ihl\u00e1s\u00edme na tok, vytv\u00e1\u0159\u00edme novou t\u0159\u00eddu <strong>subscription<\/strong>, kter\u00e1 n\u00e1m umo\u017e\u0148uje zru\u0161it odb\u011br pomoc\u00ed metody <em>unsubscribe<\/em>. Tak\u00e9 m\u016f\u017eeme seskupit odb\u011bry pomoc\u00ed metody <em>add<\/em>. A logicky, m\u016f\u017eeme odd\u011blit toky pomoc\u00ed <em>remove<\/em>. Metody add a remove p\u0159ij\u00edmaj\u00ed jin\u00fd odb\u011br. R\u00e1d bych zd\u016fraznil, \u017ee kdy\u017e se odhla\u0161ujeme, odhla\u0161ujeme se od v\u0161ech pod\u0159\u00edzen\u00fdch odb\u011br\u016f, jako bychom u nich vyvol\u00e1vali metodu unsubscribe. Pokra\u010dujme d\u00e1l.<\/p>\n<p><\/p>\n<h3 id=\"vidy-potokov\">Typy tok\u016f<\/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 je vytv\u00e1\u0159en zven\u010d\u00ed observable<\/td>\n<td>Producer je vytv\u00e1\u0159en uvnit\u0159 observable<\/td>\n<\/tr>\n<tr>\n<td>\u00dadaje jsou p\u0159ed\u00e1v\u00e1ny v okam\u017eiku vytvo\u0159en\u00ed observable<\/td>\n<td>\u00dadaje jsou sd\u011blov\u00e1ny v okam\u017eiku p\u0159ihl\u00e1\u0161en\u00ed<\/td>\n<\/tr>\n<tr>\n<td>Je pot\u0159eba dodate\u010dn\u00e1 logika pro odhl\u00e1\u0161en\u00ed<\/td>\n<td>Tok se ukon\u010duje s\u00e1m<\/td>\n<\/tr>\n<tr>\n<td>Vyu\u017e\u00edv\u00e1 vazbu jedna k mnoha<\/td>\n<td>Vyu\u017e\u00edv\u00e1 vazbu jedna k jedn\u00e9<\/td>\n<\/tr>\n<tr>\n<td>V\u0161echny odb\u011bry maj\u00ed jednotnou hodnotu<\/td>\n<td>Odb\u011bry jsou nez\u00e1visl\u00e9<\/td>\n<\/tr>\n<tr>\n<td>\u00dadaje mohou b\u00fdt ztraceny, pokud nen\u00ed odb\u011br<\/td>\n<td>Znovu vyd\u00e1v\u00e1 v\u0161echny hodnoty toku pro nov\u00fd odb\u011br<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><\/p>\n<p>Pokud bych m\u011bl u\u010dinit analogii, p\u0159edstavil bych si hork\u00fd tok jako film v kin\u011b. V jak\u00e9m okam\u017eiku jsi p\u0159i\u0161el, od toho okam\u017eiku za\u010d\u00edn\u00e1\u0161 sledovat. Studen\u00fd tok bych p\u0159irovnal k telefon\u00e1tu na technickou podporu. Ka\u017ed\u00fd, kdo zavol\u00e1, poslouch\u00e1 nahr\u00e1vku automatick\u00e9ho odpov\u00edda\u010de od za\u010d\u00e1tku do konce, ale m\u016f\u017ee\u0161 hovor ukon\u010dit pomoc\u00ed unsubscribe.<\/p>\n<p><\/p>\n<p>R\u00e1d bych poznamenal, \u017ee existuj\u00ed tak\u00e9 takzvan\u00e9 warm toky (toto ozna\u010den\u00ed jsem sly\u0161el velmi z\u0159\u00eddka a pouze v zahrani\u010dn\u00edch komunit\u00e1ch) \u2014 je to tok, kter\u00fd se transformuje z chladn\u00e9ho toku na hork\u00fd. Vznik\u00e1 ot\u00e1zka \u2014 kde ho pou\u017e\u00edt)) Uvedu p\u0159\u00edklad z praxe.<\/p>\n<p><\/p>\n<p>Pracuji s Angularem. Aktivn\u011b vyu\u017e\u00edv\u00e1 rxjs. Pro z\u00edsk\u00e1v\u00e1n\u00ed dat ze serveru o\u010dek\u00e1v\u00e1m chladn\u00fd tok a tento tok pou\u017e\u00edv\u00e1m v \u0161ablon\u011b pomoc\u00ed asyncPipe. Pokud tento pipe pou\u017e\u00edv\u00e1m n\u011bkolikr\u00e1t, vr\u00e1t\u00edm se k definici chladn\u00e9ho toku, ka\u017ed\u00fd pipe bude po\u017eadovat data ze serveru, co\u017e je, m\u00edrn\u011b \u0159e\u010deno, divn\u00e9. A pokud chladn\u00fd tok p\u0159evedu na tepl\u00fd, bude po\u017eadavek proveden pouze jednou.<\/p>\n<p><\/p>\n<p>Obecn\u011b je pochopen\u00ed typ\u016f tok\u016f pro za\u010d\u00e1te\u010dn\u00edky pom\u011brn\u011b slo\u017eit\u00e9, ale d\u016fle\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\u017enost roz\u0161\u00ed\u0159en\u00ed pr\u00e1ce s toky n\u00e1m poskytuj\u00ed oper\u00e1tory. Pom\u00e1haj\u00ed kontrolovat ud\u00e1losti, kter\u00e9 prob\u00edhaj\u00ed v Observable. Pod\u00edv\u00e1me se na n\u011bkolik nejpopul\u00e1rn\u011bj\u0161\u00edch, podrobn\u011bji se s oper\u00e1tory m\u016f\u017eete sezn\u00e1mit prost\u0159ednictv\u00edm odkaz\u016f v u\u017eite\u010dn\u00fdch informac\u00edch.<\/p>\n<p><\/p>\n<p><strong>Oper\u00e1tory \u2014 of<\/strong><\/p>\n<p><\/p>\n<p>Za\u010dn\u011bme pomocn\u00fdm oper\u00e1torem of. Vytv\u00e1\u0159\u00ed Observable na z\u00e1klad\u011b jednoduch\u00e9 hodnoty.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (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=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/24ac65fdb5ccc7f6301b3dfe49f1e804.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Filtra\u010dn\u00ed oper\u00e1tor filter, jak lze pochopit podle n\u00e1zvu, filtruje sign\u00e1l toku. Pokud oper\u00e1tor vr\u00e1t\u00ed pravdu, tak ho propou\u0161t\u00ed d\u00e1le.<\/p>\n<p><\/p>\n<p><strong>Oper\u00e1tory \u2014 take<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (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 P\u0159ij\u00edm\u00e1 hodnotu po\u010dtu emitovan\u00fdch, po kter\u00e9m skon\u010d\u00ed tok.<\/p>\n<p><\/p>\n<p><strong>Oper\u00e1tory \u2014 debounceTime<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (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 odstra\u0148uje emitovan\u00e9 hodnoty, kter\u00e9 padnou do ur\u010den\u00e9ho \u010dasov\u00e9ho intervalu mezi v\u00fdstupy \u2014 po uplynut\u00ed \u010dasov\u00e9ho intervalu emit\u00ed posledn\u00ed 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 jednou za 1000ms\n  setInterval(() =&gt; {\n    observer.next(i++)\n  }, 1000);\n\n \/\/ Emitujeme hodnotu jednou za 1500ms\n  setInterval(() =&gt; {\n    observer.next(i++)\n  }, 1500);\n}).pipe(\n  debounceTime(700),  \/\/ \u010cek\u00e1me 700ms na hodnoty p\u0159ed jejich zpracov\u00e1n\u00edm\n  take(3)\n);  <\/code><\/pre>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (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=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/120d9fe6ddf5a60ddffc8742989b27ff.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Emit\u00ed hodnoty, dokud takeWhile nevr\u00e1t\u00ed false, pot\u00e9 se odhl\u00e1s\u00ed 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  \/\/ Vyd\u00e1v\u00e1 hodnotu ka\u017ed\u00fdch 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=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (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 podobn\u00fd promise.all. Spojuje n\u011bkolik proud\u016f do jednoho. Jakmile ka\u017ed\u00fd proud vyd\u00e1 alespo\u0148 jeden emit, z\u00edsk\u00e1me posledn\u00ed hodnoty od ka\u017ed\u00e9ho ve form\u011b pole. N\u00e1sledn\u011b po jak\u00e9mkoli emitu z kombinovan\u00fdch proud\u016f bude vracet nov\u00e9 hodnoty.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (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  \/\/ Vyd\u00e1v\u00e1 hodnotu ka\u017ed\u00fdch 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  \/\/ Vyd\u00e1v\u00e1 hodnotu ka\u017ed\u00fdch 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=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (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 \u010dek\u00e1 na hodnotu z ka\u017ed\u00e9ho proudu a vytvo\u0159\u00ed pole na z\u00e1klad\u011b t\u011bchto hodnot. Pokud hodnota nep\u0159ijde z n\u011bjak\u00e9ho proudu, skupina nebude vytvo\u0159ena.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (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  \/\/ Vyd\u00e1v\u00e1 hodnotu ka\u017ed\u00fdch 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  \/\/ Vyd\u00e1v\u00e1 hodnotu ka\u017ed\u00fdch 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  \/\/ Vyd\u00e1v\u00e1 hodnotu ka\u017ed\u00fdch 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=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (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 tak\u00e9 spojuje proudy, ale vyd\u00e1v\u00e1 hodnotu pouze tehdy, kdy\u017e jsou v\u0161echny proudy dokon\u010deny (complete).<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (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  \/\/ Vyd\u00e1v\u00e1 hodnotu ka\u017ed\u00fdch 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  \/\/ Vyd\u00e1v\u00e1 hodnotu ka\u017ed\u00fdch 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  \/\/ Vyd\u00e1v\u00e1 hodnotu ka\u017ed\u00fdch 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=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (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\u00ed oper\u00e1tor map p\u0159ev\u00e1d\u00ed hodnotu emitu na novou. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (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  \/\/ Vyd\u00e1v\u00e1 hodnotu ka\u017ed\u00fdch 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=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (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 \u2013 share, tap<\/strong><\/p>\n<p><\/p>\n<p>Oper\u00e1tor tap \u2014 umo\u017e\u0148uje prov\u00e1d\u011bt vedlej\u0161\u00ed efekty, tedy jak\u00e9koli \u00fakony, kter\u00e9 neovliv\u0148uj\u00ed sekvenci.<\/p>\n<p><\/p>\n<p>U\u017eivatelsk\u00fd oper\u00e1tor share dok\u00e1\u017ee z chladn\u00e9ho toku ud\u011blat hork\u00fd. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. (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\u00e1tory jsme skon\u010dili. P\u0159ejdeme k Subject.<\/p>\n<p>\n<b class=\"spoiler_title\">My\u0161lenky nahlas<\/b><\/p>\n<p>A tady jsem \u0161el na \u010daj. Unavily m\u011b tyto p\u0159\u00edklady \ud83d\ude00<\/p>\n<p><\/p>\n<h2 id=\"semeystvo-subject-ov\">Rodina subject\u016f<\/h2>\n<p><\/p>\n<p>Rodina subject\u016f je jasn\u00fdm p\u0159\u00edkladem hork\u00fdch tok\u016f. Tyto t\u0159\u00eddy jsou jak\u00fdmsi hybridem, kter\u00fd funguje z\u00e1rove\u0148 jako observable a observer. Proto\u017ee subject je hork\u00fdm tokem, je nutn\u00e9 se od n\u011bj odhl\u00e1sit. Hlavn\u00edmi metodami jsou:<\/p>\n<p><\/p>\n<ul>\n<li>next \u2013 p\u0159ed\u00e1n\u00ed nov\u00fdch dat do toku<\/li>\n<li>error \u2013 chyba a dokon\u010den\u00ed toku<\/li>\n<li>complete \u2013 dokon\u010den\u00ed toku<\/li>\n<li>subscribe \u2013 p\u0159ihl\u00e1sit se k toku<\/li>\n<li>unsubscribe \u2013 odhl\u00e1sit se od toku<\/li>\n<li>asObservable \u2013 transformujeme na pozorovatele<\/li>\n<li>toPromise \u2013 transformuje na promise<\/li>\n<\/ul>\n<p><\/p>\n<p>Rozli\u0161uje se 4\u20135 typ\u016f subject\u016f. <\/p>\n<p>\n<b class=\"spoiler_title\">My\u0161lenky nahlas<\/b><\/p>\n<p>Na streamu jsem mluvil o 4, ale zjistil jsem, \u017ee p\u0159idali je\u0161t\u011b jeden. Jak se \u0159\u00edk\u00e1, ve v\u011bku \u017eij a ve v\u011bku se u\u010d.<\/p>\n<p><\/p>\n<p>Jednoduch\u00fd Subject <code>new Subject()<\/code>\u2013 nejjednodu\u0161\u0161\u00ed typ subject\u016f. Vytv\u00e1\u0159\u00ed se bez parametr\u016f. P\u0159ed\u00e1v\u00e1 hodnoty p\u0159ich\u00e1zej\u00edc\u00ed a\u017e po p\u0159ihl\u00e1\u0161en\u00ed.<\/p>\n<p><\/p>\n<p>BehaviorSubject <code>new BehaviorSubject(defaultData)<\/code> \u2013 podle m\u00e9ho n\u00e1zoru nejroz\u0161\u00ed\u0159en\u011bj\u0161\u00ed typ subject\u016f. P\u0159ij\u00edm\u00e1 hodnotu jako v\u00fdchoz\u00ed. V\u017edy uchov\u00e1v\u00e1 data posledn\u00edho emit, kter\u00e9 p\u0159ed\u00e1v\u00e1 p\u0159i p\u0159ihl\u00e1\u0161en\u00ed. Tato t\u0159\u00edda m\u00e1 tak\u00e9 u\u017eite\u010dnou metodu value, kter\u00e1 vrac\u00ed aktu\u00e1ln\u00ed hodnotu toku.<\/p>\n<p><\/p>\n<p>ReplaySubject <code>new ReplaySubject(bufferSize?: number, windowTime?: number)<\/code> \u2013 m\u016f\u017ee jako prvn\u00ed argument voliteln\u011b p\u0159ijmout velikost vyrovn\u00e1vac\u00ed pam\u011bti hodnot, kter\u00e9 bude uchov\u00e1vat, a jako druh\u00fd \u010das, po kter\u00fd pot\u0159ebujeme zm\u011bny.<\/p>\n<p><\/p>\n<p>AsyncSubject <code>new AsyncSubject()<\/code> \u2013 p\u0159i p\u0159ihl\u00e1\u0161en\u00ed se nic ned\u011bje a hodnota bude vr\u00e1cena pouze p\u0159i complete. Bude vr\u00e1cena pouze posledn\u00ed hodnota toku.<\/p>\n<p><\/p>\n<p>WebSocketSubject <code>new WebSocketSubject(urlConfigOrSource: string | WebSocketSubjectConfig | Observable, destination?: Observer)<\/code> \u2013 Dokumentace o n\u011bm ml\u010d\u00ed a j\u00e1 ho vid\u00edm poprv\u00e9. Kdo v\u00ed, co d\u011bl\u00e1, napi\u0161te, dopln\u00edme.<\/p>\n<p><\/p>\n<p>Uf. Tak jsme projeli v\u0161e, co jsem cht\u011bl dnes \u0159\u00edct. Douf\u00e1m, \u017ee tyto informace byly u\u017eite\u010dn\u00e9. Seznam literatury si m\u016f\u017eete prohl\u00e9dnout na z\u00e1lo\u017ece u\u017eite\u010dn\u00e9 informace.<\/p>\n<p><\/p>\n<h2 id=\"poleznaya-informaciya\">U\u017eite\u010dn\u00e9 informace<\/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> \u2013 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> \u2013 Jak funguje JS: p\u0159ehled motoru, mechanismy b\u011bhu, z\u00e1sobn\u00edk vol\u00e1n\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 Jak funguje JS: cyklus ud\u00e1lost\u00ed, asynchronn\u00ed zpracov\u00e1n\u00ed a p\u011bt zp\u016fsob\u016f, jak zlep\u0161it k\u00f3d pomoc\u00ed 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 Jak funguje Event Loop v JavaScriptu<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/tproger.ru\/translations\/asynchronous-javascript\/\">https:\/\/tproger.ru\/translations\/asynchronous-javascript\/<\/a><\/noindex> \u2014 Evoluce asynchronn\u00edho 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 Co je RxJS a pro\u010d je dobr\u00e9 to v\u011bd\u011bt<\/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 pou\u017eit\u00ed 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 Tvorba &amp; Odeb\u00edr\u00e1n\u00ed od 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: Hork\u00e9 a studen\u00e9 observables<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/clck.ru\/FiPgB\">https:\/\/clck.ru\/FiPgB<\/a><\/noindex> \u2014 T\u0159\u00eddy, funkce pro vytv\u00e1\u0159en\u00ed 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 na p\u0159\u00edkladu<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/rxjs.dev\/api\">https:\/\/rxjs.dev\/api<\/a><\/noindex> \u2014 Seznam API<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/clck.ru\/FkS8Y\">https:\/\/clck.ru\/FkS8Y<\/a><\/noindex> \u2014 Druhy Subject a Pl\u00e1ny 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.3 - 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\/cs\/blog\/news\/asinhronnoe-programmirovanie-v-javascript-callback-promise-rxjs\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\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\/cs\/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\udd47Asynchronn\u00ed programov\u00e1n\u00ed v JavaScriptu. ( Callback, Promise, RxJs ) | ProHoster","description":"Ahoj v\u0161em. Tady je Sergej Omelnytsky. Ned\u00e1vno jsem vedl stream o reaktivn\u00edm programov\u00e1n\u00ed, kde jsem hovo\u0159il o asynchronnosti v JavaScriptu. Dnes bych cht\u011bl shrnout tento materi\u00e1l.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/news\/asinhronnoe-programmirovanie-v-javascript-callback-promise-rxjs","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/36774","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=36774"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/36774\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/27545"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=36774"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=36774"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=36774"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}