{"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\/lv\/blog\/news\/asinhronnoe-programmirovanie-v-javascript-callback-promise-rxjs","title":{"rendered":"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Sveiki visiem. \u0160eit ir Ome\u013c\u0146ickis Sergejs. Pirms neilga laika es vad\u012bju straumi par reakt\u012bvo programm\u0113\u0161anu, kur run\u0101ju par asynchronit\u0101ti JavaScript. \u0160odien es gribu apkopot \u0161o materi\u0101lu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/11acf6af8328d3deb6f0ce48e813efb7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Bet pirms \u0137eramies pie galven\u0101 materi\u0101la, mums ir j\u0101dara ievads. T\u0101tad, s\u0101ksim ar defin\u012bcij\u0101m: kas ir staks un rinda?<br \/>\n<strong>Staks <\/strong>\u2014 tas ir kolekcija, kuras elementi tiek ieg\u016bti saska\u0146\u0101 ar principu \u00abp\u0113d\u0113jais n\u0101ca, pirmais izg\u0101ja\u00bb LIFO<br \/>\n<strong>Rinda <\/strong>\u2014 tas ir kolekcija, kuras elementi tiek ieg\u016bti saska\u0146\u0101 ar principu \u00abpirmais n\u0101ca, pirmais izg\u0101ja\u00bb FIFO<\/p>\n<p><\/p>\n<p>OK, turpin\u0101sim. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/a7d64d1c74f37b463869dd57b96c9d0e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>JavaScript ir vienapstr\u0101des programm\u0113\u0161anas valoda. Tas noz\u012bm\u0113, ka eksist\u0113 tikai viena izpildes pl\u016bsma un viens staks, kur\u0101 funkcijas tiek ievietotas izpildei. T\u0101d\u0113j\u0101di vienlaic\u012bgi JavaScript var izpild\u012bt tikai vienu darb\u012bbu, bet p\u0101r\u0113j\u0101s darb\u012bbas gaid\u012bs savu k\u0101rtu stak\u0101, l\u012bdz t\u0101s tiks izsauktas. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><strong>Izsaukumu staks<\/strong> \u2014 t\u0101 ir datu strukt\u016bra, kas, vienk\u0101r\u0161oti run\u0101jot, ieraksta inform\u0101ciju par to, kur programm\u0101 atrodamies. Ja m\u0113s p\u0101rejam uz funkciju, m\u0113s ievietojam ierakstu par to staka aug\u0161pus\u0113. Kad m\u0113s no funkcijas atgrie\u017eamies, m\u0113s iz\u0146emam no staka aug\u0161\u0113jo elementu un non\u0101kam tur, no kurienes izsauc\u0101m \u0161o funkciju. Tas ir viss, ko var dar\u012bt staks. Bet tagad \u013coti interesants jaut\u0101jums. K\u0101 tad darbojas asynchronit\u0101te JavaScript?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/a29fd1dd3de06fb203c7dd14bda30548.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Paties\u012bb\u0101, iz\u0146emot staku, p\u0101rl\u016bkprogramm\u0101s ir \u012bpa\u0161a rinda, kas darbojas ar t\u0101 saukto WebAPI. Funkcijas no \u0161\u012bs rindas tiks izpild\u012btas sec\u012bgi tikai p\u0113c tam, kad staks b\u016bs piln\u012bb\u0101 not\u012br\u012bts. Tikai p\u0113c tam t\u0101s tiek ievietotas no rindas stak\u0101 izpildei. Ja stak\u0101 patlaban ir vismaz viens elements, tad t\u0101s nevar iek\u013c\u016bt stak\u0101. Tie\u0161i t\u0101p\u0113c funkciju izsaukumi ar taimeri bie\u017ei ir neprec\u012bzi laik\u0101, jo funkcija nevar iek\u013c\u016bt stak\u0101, kam\u0113r tas ir piepild\u012bts. <\/p>\n<p><\/p>\n<p>Apskat\u012bsim n\u0101kamo piem\u0113ru un veiksim t\u0101 so\u013cveida \u00abizpildi\u00bb. Ar\u012b apskat\u012bsim, kas notiek sist\u0113m\u0101.<\/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=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/379423fca95fb28b2124be03dfd15739.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>1) Pa\u0161laik nekas nenotiek. P\u0101rl\u016bka konsole ir t\u012bra, izsaukumu staks ir tuk\u0161s.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/4a16bbc23bade54ae0b02d81d5f6a581.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>2) P\u0113c tam komanda console.log(&#8216;Hi&#8217;) tiek pievienota izsaukumu stakam.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/a1845af23fd7dedebf94afc168f1f13f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>3) Un t\u0101 tiek izpild\u012bta<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/57397b53386018b662f3a79a6d4d60fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>4) Tad console.log('Hi') tiek no\u0146emts no izsaukumu steka.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/7cb2b32be8807ecf39d2f38683ccd435.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>5) Tagad p\u0101rej\u0101m pie komandas setTimeout(function cb1() {\u2026 }). T\u0101 tiek pievienota izsaukumu stekam.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/99c0724994e3390d009577852b451beb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>6) Komanda setTimeout(function cb1() {\u2026 }) tiek izpild\u012bta. P\u0101rl\u016bkprogramma izveido taimeri, kas ir da\u013ca no Web API. Tas veiks laika atskaiti.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/99086cdeafd83c5fe72e92c4a9f9b738.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>7) Komanda setTimeout(function cb1() {\u2026 }) ir pabeigusi darbu un tiek no\u0146emta no izsaukumu steka.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/24ac12b1b6cfbff780ece9e9a7acd7c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>8) Komanda console.log('Bye') tiek pievienota izsaukumu stekam.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/6ccad0ad8eebf05e870a409766d38766.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>9) Komanda console.log('Bye') tiek izpild\u012bta.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/09e4e380eb873fb23bea550f3ffb21f7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>10) Komanda console.log('Bye') tiek no\u0146emta no izsaukumu steka.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/357bfb372361310681ba7bb1860d90d7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>11) P\u0113c tam, kad ir pag\u0101ju\u0161i vismaz 5000 ms., taimeris pabeidz darbu un ievieto atgriezenisko saiti cb1 atgriezenisko zvanu rind\u0101.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/8170e8ff5d3d0c56c0091658370c25cc.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>12) Notikumu cikls \u0146em funkciju cb1 no atgriezenisko zvanu rindas un ievieto to izsaukumu stek\u0101.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/d858a54e82bc32d84f854610db462bc1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>13) Funkcija cb1 tiek izpild\u012bta un pievieno console.log('cb1') izsaukumu stekam.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/6ca8e016389904eec57035e64d57a157.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>14) Komanda console.log('cb1') tiek izpild\u012bta.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/0caa645a90ac1fca5fb8a76569494d48.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>15) Komanda console.log('cb1') tiek no\u0146emta no izsaukumu steka.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/aeb838fe8df3f6e3f8603a4207a6e193.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>16) Funkcija cb1 tiek no\u0146emta no izsaukumu steka.<\/p>\n<p><\/p>\n<p>Paskat\u012bsimies uz piem\u0113ru dinamisk\u0101 veid\u0101:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/3836d9df513afee374f498720990e39f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>T\u0101tad m\u0113s esam apskat\u012bju\u0161i, k\u0101 JavaScript \u012bsteno asinkroniju. Tagad \u012bsi parun\u0101sim par asinkron\u0101 koda evolucion\u0101.<\/p>\n<p><\/p>\n<h2 id=\"evolyuciya-asinhronnogo-koda\">Asinkron\u0101 koda evol\u016bcija.<\/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>Asinkron\u0101 programm\u0113\u0161ana, k\u0101du m\u0113s to paz\u012bstam JavaScript, var tikt \u012bstenota tikai ar funkcij\u0101m. T\u0101s var tikt nodotas k\u0101 jebkura cita main\u012bg\u0101 cit\u0101m funkcij\u0101m. T\u0101d\u0101 veid\u0101 rad\u0101s atgriezenisk\u0101s saites. Un tas ir for\u0161i, jautri un dz\u012bv\u012bgi, kam\u0113r tas nenon\u0101k skumj\u0101s, b\u0113d\u0101s un raud\u0101\u0161an\u0101. K\u0101p\u0113c? Viss ir vienk\u0101r\u0161i:<\/p>\n<p><\/p>\n<ul>\n<li>Ar koda sare\u017e\u0123\u012bt\u012bbas palielin\u0101\u0161anos, projekts \u0101tri p\u0101rv\u0113r\u0161as par nesaprotam\u0101m daudzk\u0101rt\u0113ji iek\u013caut\u0101m blokiem \u2014 \"callback hell\".<\/li>\n<li>K\u013c\u016bdas apstr\u0101di var viegli palaist gar\u0101m.<\/li>\n<li>Nav iesp\u0113jams atgriezt izsme\u013co\u0161u ar return.<\/li>\n<\/ul>\n<p><\/p>\n<p>Ar Promise par\u0101d\u012b\u0161anos situ\u0101cija k\u013cuva nedaudz lab\u0101ka.<\/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>Par\u0101d\u012bj\u0101s sol\u012bjumu \u0137\u0113des, kas uzlaboja koda las\u0101m\u012bbu.<\/li>\n<li>Par\u0101d\u012bj\u0101s atsevi\u0161\u0137a metode k\u013c\u016bdu uztver\u0161anai.<\/li>\n<li>Par\u0101d\u012bj\u0101s iesp\u0113ja paral\u0113lai izpildei, izmantojot Promise.all<\/li>\n<li>M\u0113s varam atrisin\u0101t iek\u0161\u0113jo asinhro izsaukumu, izmantojot async\/await<\/li>\n<\/ul>\n<p><\/p>\n<p>Bet sol\u012bjumam ir savi ierobe\u017eojumi. Piem\u0113ram, sol\u012bjumu nevar atcelt bez papildu \u0161ama, un pats galvenais \u2014 tas darbojas ar vienu v\u0113rt\u012bbu.<\/p>\n<p><\/p>\n<p>Nu l\u016bk, m\u0113s pak\u0101peniski esam non\u0101ku\u0161i pie rea\u0123\u0113jo\u0161as programm\u0113\u0161anas. Vai esat noguru\u0161i? Nu, par laimi, varat aiziet uzv\u0101r\u012bt t\u0113ju, izdom\u0101t un atgriezties, lai las\u012btu t\u0101l\u0101k. Es turpin\u0101\u0161u.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/48409ec625d57fec171214c1de332c85.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Rea\u0123\u0113jo\u0161a programm\u0113\u0161ana<\/strong>\u2212 programm\u0113\u0161anas paradigmas, kas orient\u0113ta uz datu pl\u016bsm\u0101m un izmai\u0146u izplat\u012b\u0161anos. Izskat\u012bsim s\u012bk\u0101k, kas ir datu pl\u016bsma.<\/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>Iedom\u0101simies, ka mums ir ievades lauks. M\u0113s izveidojam mas\u012bvu, un uz katru keyup notikumu ievad\u0113 m\u0113s saglab\u0101jam notikumu m\u016bsu mas\u012bv\u0101. Taj\u0101 pa\u0161\u0101 laik\u0101 ir j\u0101atz\u012bm\u0113, ka m\u016bsu mas\u012bvs ir sak\u0101rtots p\u0113c laika \u2014 t.i., v\u0113l\u0101kie notikumi ieg\u016bst liel\u0101ku indeksu nek\u0101 agr\u0101ki. \u0160\u0101ds mas\u012bvs ir vienk\u0101r\u0161ota datu pl\u016bsmas mode\u013ca, bet tas v\u0113l nav pl\u016bsma. Lai \u0161o mas\u012bvu var\u0113tu dro\u0161i nosaukt par pl\u016bsmu, tam j\u0101sp\u0113j k\u0101d\u0101 veid\u0101 inform\u0113t abonentus, ka taj\u0101 ir ien\u0101ku\u0161i jauni dati. T\u0101d\u0113j\u0101di m\u0113s non\u0101kam pie datu pl\u016bsmas defin\u012bcijas.<\/p>\n<p><\/p>\n<h3 id=\"potok-dannyh\">Datu pl\u016bsma<\/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=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/68ec447abafb6b8a323b429ed94f8252.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Pl\u016bsma<\/strong>\u2014 tas ir laika sak\u0101rtotu datu mas\u012bvs, kur\u0161 var zi\u0146ot par to, ka dati ir main\u012bju\u0161ies. Un tagad iedom\u0101jieties, cik \u0113rti k\u013c\u016bst rakst\u012bt kodu, kur\u0101 vienai darb\u012bbai ir nepiecie\u0161ams izsaukt vair\u0101kus notikumus da\u017e\u0101d\u0101s kod\u0113\u0161anas viet\u0101s. M\u0113s vienk\u0101r\u0161i veicam abon\u0113\u0161anu uz pl\u016bsmu, un t\u0101 pati inform\u0113s m\u016bs, kad notiks izmai\u0146as. To sp\u0113j dar\u012bt RxJs bibliot\u0113ka.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (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 t\u0101 ir bibliot\u0113ka, kas paredz\u0113ta asinhro un notikumu balst\u012btu programmu izstr\u0101dei, izmantojot nov\u0113rojamas sec\u012bbas. Bibliot\u0113ka nodro\u0161ina galveno tipu <em>Observable<\/em>, vair\u0101kus pal\u012bgtipus (<em>Observer, Schedulers, Subjects<\/em>) un operatorus, kas apstr\u0101d\u0101 notikumus k\u0101 kolekcijas (<em>map, filter, reduce, every<\/em> un taml\u012bdz\u012bgas JavaScript mas\u012bvam).<\/p>\n<p><\/p>\n<p>Apskat\u012bsim \u0161\u012bs bibliot\u0113kas galvenos j\u0113dzienus.<\/p>\n<p><\/p>\n<h3 id=\"observable-observer-producer\">Observable, Observer, Producer<\/h3>\n<p><\/p>\n<p>Observable \u2014 pirmais pamata tips, ko m\u0113s apskat\u012bsim. \u0160\u012b klase satur galveno RxJs realiz\u0101ciju. T\u0101 ir saist\u012bta ar nov\u0113rojamo pl\u016bsmu, uz kuru var abon\u0113t, izmantojot metodi subscribe.<\/p>\n<p><\/p>\n<p>Observable realiz\u0113 meh\u0101nismu atjaunin\u0101jumu izveidei, ko sauc par <em>Observer<\/em>. V\u0113rt\u012bbu avots Observer tiek saukts par <em>Ra\u017eot\u0101js<\/em>. Tas var b\u016bt mas\u012bvs, iterators, t\u012bmek\u013ca ligzda, k\u0101ds notikums utt. T\u0101tad var teikt, ka observable ir starpnieks starp Producer un Observer. <\/p>\n<p><\/p>\n<p>Observable apstr\u0101d\u0101 tr\u012bs veidu notikumus Observer:<\/p>\n<p><\/p>\n<ul>\n<li>next \u2013 jauni dati<\/li>\n<li>error \u2013 k\u013c\u016bda, ja sec\u012bba nosl\u0113dzas iz\u0146\u0113muma situ\u0101cijas d\u0113\u013c. \u0160is notikums ar\u012b liecina par sec\u012bbas pabeig\u0161anu.<\/li>\n<li>complete \u2014 sign\u0101ls par sec\u012bbas pabeig\u0161anu. Tas noz\u012bm\u0113, ka jauni dati vairs neb\u016bs.<\/li>\n<\/ul>\n<p><\/p>\n<p>Apskat\u012bsim demo:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/c5bcd2af0f18b6de3ab0dbc20db595d1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>S\u0101kum\u0101 m\u0113s apstr\u0101d\u0101sim v\u0113rt\u012bbas 1, 2, 3, p\u0113c tam, p\u0113c 1 sek., m\u0113s sa\u0146emsim 4 un pabeigsim m\u016bsu pl\u016bsmu.<\/p>\n<p>\n<b class=\"spoiler_title\">Dom\u0101\u0161ana ska\u013ci<\/b><\/p>\n<p>Un tad es sapratu, ka st\u0101st\u012bt bija interesant\u0101k nek\u0101 par to rakst\u012bt. \ud83d\ude00 <\/p>\n<p><\/p>\n<h3 id=\"subscription\">Subscription<\/h3>\n<p><\/p>\n<p>Kad m\u0113s veicam abon\u0113\u0161anu uz pl\u016bsmu, m\u0113s izveidojam jaunu klasi <strong>subscription<\/strong>, kas dod mums iesp\u0113ju atcelt abon\u0113\u0161anu, izmantojot metodi <em>unsubscribe<\/em>. M\u0113s ar\u012b varam grup\u0113t abonementus, izmantojot metodi <em>add<\/em>. Un ir lo\u0123iski, ka m\u0113s varam atgrup\u0113t pl\u016bsmas, izmantojot <em>iz\u0146emt<\/em>. Metodes add un remove pie\u0146em citu abonementu k\u0101 ievadi. V\u0113los nor\u0101d\u012bt, ka, veicot atak\u0161anu, m\u0113s atteicamies no vis\u0101m meitas abonementiem, it k\u0101 m\u0113s vi\u0146iem b\u016btu izsauku\u0161i metodi unsubscribe. Iesim t\u0101l\u0101k.<\/p>\n<p><\/p>\n<h3 id=\"vidy-potokov\">Pl\u016bsmu veidi<\/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 tiek izveidots \u0101rpus observable<\/td>\n<td>Producer tiek izveidots iek\u0161pus\u0113 observable<\/td>\n<\/tr>\n<tr>\n<td>Dati tiek nodoti mirkli p\u0113c observable izveides<\/td>\n<td>Dati tiek sniegti abon\u0113\u0161anas br\u012bd\u012b<\/td>\n<\/tr>\n<tr>\n<td>Nepiecie\u0161ama papildu lo\u0123ika, lai atteiktos<\/td>\n<td>Pl\u016bsma nosl\u0113dzas patst\u0101v\u012bgi<\/td>\n<\/tr>\n<tr>\n<td>Izmanto vienu-pie-daudziem attiec\u012bbas<\/td>\n<td>Izmanto vienu-pie-vienam attiec\u012bbas<\/td>\n<\/tr>\n<tr>\n<td>Visi abonementi ir ar vienotu v\u0113rt\u012bbu<\/td>\n<td>Abonementi ir neatkar\u012bgi<\/td>\n<\/tr>\n<tr>\n<td>Dati var tikt zaud\u0113ti, ja nav abonementa<\/td>\n<td>P\u0101rdod visus pl\u016bsmas v\u0113rt\u012bbas jaunai abon\u0113\u0161anai<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><\/p>\n<p>Ja m\u0113s veiksim sal\u012bdzin\u0101jumu, es iedom\u0101tos karsto pl\u016bsmu k\u0101 filmu kinote\u0101tr\u012b. Kur\u0101 br\u012bd\u012b tu ierad\u012bsies, no t\u0101 br\u012b\u017ea ar\u012b s\u0101ksi skat\u012bties. Auksto pl\u016bsmu es sal\u012bdzin\u0101tu ar zvanu tehniskajai atbalstam. Ikviens, kur\u0161 zvan\u012bs, klaus\u0101s autom\u0101tisk\u0101 atbild\u0113t\u0101ja ierakstu no s\u0101kuma l\u012bdz beig\u0101m, ta\u010du tu vari nobeigt zvanu, izmantojot unsubscribe.<\/p>\n<p><\/p>\n<p>V\u0113r\u0161u uzman\u012bbu, ka past\u0101v ar\u012b t\u0101 saucamie siltie pl\u016bdi (\u0161\u0101du defin\u012bciju es reti esmu sastapis, un tikai starptautiskaj\u0101s kopien\u0101s) \u2014 tas ir pl\u016bds, kas p\u0101rv\u0113r\u0161as no aukst\u0101 pl\u016bduma siltaj\u0101. Rodas jaut\u0101jums \u2014 kur to izmantot)) Aizved\u012b\u0161u piem\u0113ru no prakses.<\/p>\n<p><\/p>\n<p>Es str\u0101d\u0101ju ar Angular. Tas akt\u012bvi izmanto RxJS. Datu ieg\u016b\u0161anai no servera es sagaidu auksto pl\u016bdu un \u0161o pl\u016bdu izmantoju veidn\u0113, izmantojot asyncPipe. Ja es izmantoju \u0161o cauruli vair\u0101kas reizes, atgrie\u017eoties pie aukst\u0101 pl\u016bda defin\u012bcijas, katra caurule piepras\u012bs datus no servera, kas, maigi sakot, ir d\u012bvaini. Ja es p\u0101rveidoju auksto pl\u016bdu silt\u0101, piepras\u012bjums notiks tikai vienu reizi.<\/p>\n<p><\/p>\n<p>Visp\u0101r, izpratne par pl\u016bdu veidiem ir diezgan sare\u017e\u0123\u012bta ies\u0101c\u0113jiem, ta\u010du t\u0101 ir svar\u012bga. <\/p>\n<p><\/p>\n<h3 id=\"operators\">Operators<\/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>Mums papla\u0161in\u0101t iesp\u0113jas str\u0101d\u0101t ar pl\u016bdiem pal\u012bdz operatori. Tie pal\u012bdz kontrol\u0113t notikumus, kas notiek Observable. M\u0113s apskat\u012bsim da\u017eus no popul\u0101r\u0101kajiem, bet s\u012bk\u0101k ar operatoriem var iepaz\u012bties saites noder\u012bg\u0101s inform\u0101cijas sada\u013c\u0101.<\/p>\n<p><\/p>\n<p><strong>Operatori \u2014 of<\/strong><\/p>\n<p><\/p>\n<p>S\u0101ksim ar pal\u012bgoperatoru of.\u00a0Tas izveido\u00a0Observable\u00a0balstoties uz vienk\u0101r\u0161u v\u0113rt\u012bbu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/68f382447e306392b025867a9a1e88e7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Operatori \u2014 filter<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/24ac65fdb5ccc7f6301b3dfe49f1e804.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Filtr\u0113\u0161anas operators filter, k\u0101 var saprast no nosaukuma, filtr\u0113 pl\u016bdu sign\u0101lu. Ja operators atgrie\u017e paties\u012bbu, tas p\u0101rejot t\u0101l\u0101k.<\/p>\n<p><\/p>\n<p><strong>Operatori \u2014 take<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (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 Pie\u0146em izstaroto v\u0113rt\u012bbu skaitu, p\u0113c kura pabeidz pl\u016bdu.<\/p>\n<p><\/p>\n<p><strong>Operatori \u2014 debounceTime<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (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 noraida izstarot\u0101s v\u0113rt\u012bbas, kas iek\u013caujas nor\u0101d\u012btaj\u0101 laikposm\u0101 starp izvades datiem \u2014 p\u0113c laika interv\u0101la izstarot p\u0113d\u0113jo v\u0113rt\u012bbu.<\/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  \/\/ Izstarojam v\u0113rt\u012bbu reizi 1000 ms\n  setInterval(() =&gt; {\n    observer.next(i++)\n  }, 1000);\n\n \/\/ Izstarojam v\u0113rt\u012bbu reizi 1500 ms\n  setInterval(() =&gt; {\n    observer.next(i++)\n  }, 1500);\n}).pipe(\n  debounceTime(700),  \/\/ Gaid\u0101m 700 ms v\u0113rt\u012bbas pirms apstr\u0101d\u0101t\n  take(3)\n);  <\/code><\/pre>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/dbb690d6fea6c43c1f0a2bdabea57934.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Operatori \u2014 takeWhile<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/120d9fe6ddf5a60ddffc8742989b27ff.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Izstarojam v\u0113rt\u012bbas, kam\u0113r takeWhile neatgrie\u017e false, p\u0113c tam atsl\u0113dzamies no pl\u016bda.<\/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  \/\/ Izvada v\u0113rt\u012bbu reizi 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=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/d2910d1bf9fab228acc9241fdbad3d4a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Operators \u2014 combineLatest<\/strong><\/p>\n<p><\/p>\n<p>Kombin\u0113tais operators combineLatest ir l\u012bdz\u012bgs promise.all. Tas apvieno vair\u0101kus pl\u016bsmas vien\u0101. P\u0113c tam, kad katra pl\u016bsma izmet vismaz vienu v\u0113rt\u012bbu, m\u0113s ieg\u016bstam p\u0113d\u0113j\u0101s v\u0113rt\u012bbas no katras k\u0101 mas\u012bvu. Turkl\u0101t, p\u0113c jebkuras izme\u0161anas no apvienotajiem pl\u016bsm\u0101m, tas atgrie\u017e jaunas v\u0113rt\u012bbas.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (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  \/\/ Izvada v\u0113rt\u012bbu reizi 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  \/\/ Izvada v\u0113rt\u012bbu reizi 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=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/7fc35461f446987ef81302ff7c2ed5a8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Operators \u2014 zip<\/strong><\/p>\n<p><\/p>\n<p>Zip gaida v\u0113rt\u012bbu no katras pl\u016bsmas un veido mas\u012bvu, pamatojoties uz \u0161\u012bm v\u0113rt\u012bb\u0101m. Ja v\u0113rt\u012bba nenon\u0101k no k\u0101das pl\u016bsmas, grupa netiks izveidota.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (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  \/\/ Izvada v\u0113rt\u012bbu reizi 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  \/\/ Izvada v\u0113rt\u012bbu reizi 750\n  setInterval(() =&gt; {\n    observer.next('b: ' + i++);\n  }, 750);\n});\n\nconst observer_3 = Observable.create((observer) =&gt; {\n  let i = 1;\n  \/\/ Izvada v\u0113rt\u012bbu reizi 500\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=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/e2606bf8ea5f8a660699ebe896a27d80.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Operators \u2014 forkJoin<\/strong><\/p>\n<p><\/p>\n<p>forkJoin ar\u012b apvieno pl\u016bsmas, ta\u010du tas izmet v\u0113rt\u012bbu tikai tad, kad visas pl\u016bsmas tiks pabeigtas (complete).<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (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  \/\/ Izvada v\u0113rt\u012bbu reizi 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  \/\/ Izvada v\u0113rt\u012bbu reizi 750\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  \/\/ Izvada v\u0113rt\u012bbu reizi 500\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=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/df110efc7ece46fc1d8da2d7693f75bb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Operators \u2014 map<\/strong><\/p>\n<p><\/p>\n<p>Transform\u0101cijas operators map p\u0101rveido izme\u0161anas v\u0113rt\u012bbu jaun\u0101. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (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  \/\/ Izvada v\u0113rt\u012bbu reizi 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=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/4e4ff3e2eb4acf69f16559c711a2e666.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Operators \u2013 share, tap<\/strong><\/p>\n<p><\/p>\n<p>Operator tap \u2014 \u013cauj veikt side efektus, t.i., jebk\u0101das darb\u012bbas, kas neietekm\u0113 sec\u012bbu.<\/p>\n<p><\/p>\n<p>Pal\u012bdz\u012bbas operators share sp\u0113j no auksta pl\u016bsmas padar\u012bt to karstu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Asinhron\u0101 programm\u0113\u0161ana JavaScript. (Callback, Promise, RxJs)\" src=\"\/wp-content\/uploads\/2019\/08\/c46e96420ed78d197ceef829ff74c82d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Esam pabeigu\u0161i ar oper\u0101toriem. P\u0101riesim pie Subject.<\/p>\n<p>\n<b class=\"spoiler_title\">Dom\u0101\u0161ana ska\u013ci<\/b><\/p>\n<p>Un tad es devos dzert t\u0113ju. \u0160ie piem\u0113ri mani nogurdin\u0101ja \ud83d\ude00<\/p>\n<p><\/p>\n<h2 id=\"semeystvo-subject-ov\">Subject \u0123imene<\/h2>\n<p><\/p>\n<p>Subject \u0123imene ir spilgts piem\u0113rs karst\u0101m pl\u016bsm\u0101m. \u0160ie klas\u0113m ir k\u0101ds hibr\u012bds, kas vienlaic\u012bgi darbojas k\u0101 observable un observer. T\u0101 k\u0101 subject ir karsta pl\u016bsma, ir nepiecie\u0161ams no t\u0101 atteikties. Ja run\u0101jam par galvenaj\u0101m metod\u0113m, tad t\u0101s ir:<\/p>\n<p><\/p>\n<ul>\n<li>next \u2013 jaunu datu p\u0101rs\u016bt\u012b\u0161ana pl\u016bsm\u0101<\/li>\n<li>error \u2013 k\u013c\u016bda un pl\u016bsmas beigas<\/li>\n<li>complete \u2013 pl\u016bsmas nosl\u0113gums<\/li>\n<li>subscribe \u2013 pierakst\u012bties uz pl\u016bsmu<\/li>\n<li>unsubscribe \u2013 atteikties no pl\u016bsmas<\/li>\n<li>asObservable \u2013 transform\u0113jam par nov\u0113rot\u0101ju<\/li>\n<li>toPromise \u2013 p\u0101rv\u0113r\u0161 par sol\u012bjumu<\/li>\n<\/ul>\n<p><\/p>\n<p>Iz\u0161\u0137ir 4 5 veidu subject-us. <\/p>\n<p>\n<b class=\"spoiler_title\">Dom\u0101\u0161ana ska\u013ci<\/b><\/p>\n<p>Es teicu 4, bet izr\u0101d\u012bj\u0101s, ka vi\u0146i v\u0113l vienu pievienoju\u0161i. K\u0101 saka, m\u016b\u017es dz\u012bvo, m\u016b\u017es m\u0101cies.<\/p>\n<p><\/p>\n<p>Vienk\u0101r\u0161ais Subject <code>new Subject()<\/code>\u2013 visvienk\u0101r\u0161\u0101kais subject veids. Tiek rad\u012bts bez parametriem. P\u0101rs\u016bta v\u0113rt\u012bbas, kas sa\u0146emtas tikai p\u0113c pierakst\u012b\u0161an\u0101s.<\/p>\n<p><\/p>\n<p>BehaviorSubject <code>new BehaviorSubject(defaultData&lt;T&gt;)<\/code> \u2013 manupr\u0101t, visizplat\u012bt\u0101kais subject veids. Ievad\u0113 pie\u0146em noklus\u0113juma v\u0113rt\u012bbu. Vienm\u0113r saglab\u0101 p\u0113d\u0113j\u0101 emit\u0113\u0161anas datus, kurus p\u0101rs\u016bta, kad pierakst\u0101s. \u0160ai klasei ir ar\u012b noder\u012bga metode value, kas atgrie\u017e pa\u0161reiz\u0113jo pl\u016bsmas v\u0113rt\u012bbu.<\/p>\n<p><\/p>\n<p>ReplaySubject <code>new ReplaySubject(bufferSize?: number, windowTime?: number)<\/code> \u2014 ievad\u0113 p\u0113c izv\u0113les var pie\u0146emt pirmo argumentu k\u0101 v\u0113rt\u012bbu buferi, ko tas glab\u0101s sev\u012b, un otro k\u0101 laiku, cik ilgi mums nepiecie\u0161ami izmai\u0146as.<\/p>\n<p><\/p>\n<p>AsyncSubject <code>new AsyncSubject()<\/code> \u2014 pie pierakst\u012b\u0161an\u0101s nekas nenotiek, un v\u0113rt\u012bba tiks atgriezta tikai pie complete. Tiks atgriezta tikai p\u0113d\u0113j\u0101 v\u0113rt\u012bba no pl\u016bsmas.<\/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 Par to dokument\u0101cij\u0101 nekas nav min\u0113ts, un es pats to redzu pirmoreiz. Kas zina, ko tas dara, rakstiet, papildin\u0101sim.<\/p>\n<p><\/p>\n<p>Oho. Nu, l\u016bk, m\u0113s esam apskat\u012bju\u0161i visu, ko \u0161odien grib\u0113ju izst\u0101st\u012bt. Ceru, ka \u0161\u012b inform\u0101cija bija noder\u012bga. Izp\u0113t\u012bt literat\u016bras sarakstu var pa\u0161iem sada\u013c\u0101 noder\u012bga inform\u0101cija.<\/p>\n<p><\/p>\n<h2 id=\"poleznaya-informaciya\">Noder\u012bga inform\u0101cija<\/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 saite uz straumi<\/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 K\u0101 darbojas JS: dzin\u0113ja, izpildes meh\u0101nismu un izsaukumu steka p\u0101rskats<\/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 K\u0101 str\u0101d\u0101 JS: notikumu cikls, asynchronit\u0101te un pieci veidi, k\u0101 uzlabot kodu, izmantojot 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 K\u0101 darbojas notikumu cikls JavaSript\u0101<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/tproger.ru\/translations\/asynchronous-javascript\/\">https:\/\/tproger.ru\/translations\/asynchronous-javascript\/<\/a><\/noindex> \u2014 Asinhron\u0101 JavaScript evol\u016bcija<\/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 Kas ir RxJS un k\u0101p\u0113c tas ir noder\u012bgi zin\u0101t<\/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 Praktiska RxJS lieto\u0161ana<\/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 apm\u0101c\u012bba - izveido\u0161ana un abon\u0113\u0161ana uz 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: karstie un aukstie Observables<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/clck.ru\/FiPgB\">https:\/\/clck.ru\/FiPgB<\/a><\/noindex> \u2014 Klases, funkcijas Observable izveidei. Operatori.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.learnrxjs.io\/operators\/\">https:\/\/www.learnrxjs.io\/operators\/<\/a><\/noindex> \u2014 RxJS operatori p\u0113c piem\u0113riem<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/rxjs.dev\/api\">https:\/\/rxjs.dev\/api<\/a><\/noindex> \u2014 API saraksts<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/clck.ru\/FkS8Y\">https:\/\/clck.ru\/FkS8Y<\/a><\/noindex> \u2014 Subject veidi un grafiki RxJS<\/li>\n<\/ul>\n<p>Avots: <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.4 - 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\/lv\/blog\/news\/asinhronnoe-programmirovanie-v-javascript-callback-promise-rxjs\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"lv_LV\" \/>\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\/lv\/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\udd47Asinhron\u0101 programm\u0113\u0161ana JavaScript. ( Callback, Promise, RxJs ) | ProHoster","description":"Sveiki visiem. \u0160eit ir Ome\u013c\u0146ickis Sergejs. Pirms neilga laika es vad\u012bju straumi par reakt\u012bvo programm\u0113\u0161anu, kur run\u0101ju par asynchronit\u0101ti JavaScript. \u0160odien es gribu apkopot \u0161o materi\u0101lu.","canonical_url":"https:\/\/prohoster.info\/lv\/blog\/news\/asinhronnoe-programmirovanie-v-javascript-callback-promise-rxjs","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"lv_LV","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\/lv\/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\/lv\/wp-json\/wp\/v2\/posts\/36774","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/comments?post=36774"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts\/36774\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/media\/27545"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/media?parent=36774"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/categories?post=36774"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/tags?post=36774"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}