CSP vs RxJS: mida te ei tea.

Mis juhtus CSP-ga?

Foto James Pond saidil Unsplash

Tõenäoliselt klõpsasite sellel artiklil, mõeldes „mis on CSP?” See edastab järjestikuseid protsesse. Kas olete endiselt hämmeldunud?

CSP on meetod koodide erinevate funktsioonide (generaatorite) vaheliseks suhtlemiseks jagatud kanali abil.

Mida see maailmas tähendab? Lemme ütle seda otse. Seal on see kanali kontseptsioon. Mõelge sellele nagu järjekord. Sellele saate asju panna ja asju ära võtta.

Nii et kahe funktsiooni korral saate lasta ühel kanalil (produtsendil) kraami lisada ja teises asja ära tõmmata ja mõnda tööd teha (tarbijal).

Tüüpiline eelneva kasutamise juhtum oleks mitu tootjat ja üks tarbija. Sel moel saate saadud andmeid juhtida, kuid neid võib teile anda mitmel viisil.

Erinevalt RxJS-st on need kanalid automaatsed. Väärtusi ei saa halvasti, peate neid küsima.

CSP kasutamine

Siin on väike CSP näide, mis kasutab ülilihtsat (ja surnud) teeki Channel4:

CSP kanalid töötavad asünkroonselt. Niipea, kui see käivitatakse, logitakse kõigepealt sünkroonne teade "TEHTUD". Siis hukatakse meie kanalite vastuvõtjad järjekorras.

Kõige huvitavam on minu jaoks CSP blokeerimine (kuid asünk). Pange tähele, kuidas me lõime kolmanda võtte enne, kui panime kanalile „C”. Erinevalt kahest esimesest funktsioonist pole kolmandal enam midagi võtta. Kui midagi kanalisse tuleb, võtab ta selle kohe.

Pange tähele ka seda, et tarbijad peavad pidevalt asju kanalilt eemaldama, kuni see kanal sulgub. Sellepärast ei kirjutata "D" kunagi sisse. Järgmise väärtuse eemaldamiseks kanalilt peate määratlema veel ühe võtmise.

Vaatluste abil antakse teile väärtusi, nii et te ei pea muretsema nende käsitsi eemaldamise pärast. Kui soovite neid väärtusi puhverdada, pakub RxJS selleks otstarbeks üsna palju gaasijuhtme meetodeid. CSP-d pole vaja kasutada.

Vaatlusobjektide mõte seisneb selles, et kõik kuulajad saavad samad andmed kohe, kui vaatleja järgmisele helistab. CSP puhul on see sarnane IxJS-i lähenemisviisiga, kus käsitlete andmeid tükkidena.

CSP on surnud !?

CSP rakendused leiate kaustadest Go and Closure. JavaScriptis on kõik peale paari CSP teegid surnud ja isegi siis on nende vaatajaskond väike .

Sain CSP kohta teada Vincenzo Chianese vinge jutust. Ta soovitas seda tipptasemel raamatukogu nimega js-csp. Kahjuks ei säilitata seda enam.

Selle põhjal, mida ta oma 2017. aasta jutus ütles, tundus see olevat suur asi. Ta rääkis, kuidas muundurid mõne kuu pärast plahvatada kavatsevad ja kuidas js-csp neile juba tuge pakkus.

Tundus, et CSP võiks põhjalikult muuta JavaScripti asünkrirakenduste väljatöötamist. Kuid mitte ühtegi sellist ei juhtunud kunagi. Muundurid surid ära; asendatakse raamatukogudega nagu RxJS ja CSP ümbritsev hüpe lahustus.

Vincenzo pani tähele, kuidas CSP on lubadustest kõrgem tase. Tal on õigus. Võimsus, mis teil on mitmete funktsioonide asünkroonsel interaktsioonil, on uskumatu.

Oma lubaduste tõttu pole lubadused isegi samas palliplatsis. Vähe sellest, et ta teadis, et paar viimast CSP raamatukogu toetavad lõpuks lubadusi .

CSP alternatiiv: Redux-saaga

Kui olete kunagi Redux-Saagat kasutanud, kõlavad ideed ja kontseptsioonid CSP ümber ilmselt tuttavatena. Sellepärast, et nad on. Tegelikult on Redux-Saga CSP rakendus JavaScriptis; kõige populaarsem siiani.

Redux-Sagases on olemas isegi mõiste "kanalid":
https://github.com/redux-saga/redux-saga/blob/master/docs/advanced/Channels.md

Kanalid saavad teavet väliste sündmuste, puhvertoimingute kaudu Reduxi poodi ja suhtlevad kahe saaga vahel. Samamoodi kasutatakse neid CSP-s samade võtmise ja panemise funktsioonidega.

Päris lahe näha CSP tegelikku rakendamist JavaScriptis, kuid kummalised on väga vähesed seda märganud. See näitab teile, kui vähe CSP enne suremist maha võttis.

CSP alternatiiv: redux-jälgitav

Võib-olla olete kuulnud midagi, mida nimetatakse Redux-Observable. See on sarnane kontseptsioon CSP-le ja Redux-Sagale, kuid generaatorite imperatiivse stiili asemel võtab see funktsionaalse lähenemise ja kasutab RxJS-i torujuhtmeid, mida nimetatakse “eeposteks”.

Redux-Observable'is toimub kõik kahe subjekti kaudu: action $ ja state $. Need on teie kanalid.

Käsitsi võtmise ja panemise asemel kuulate toimingu või olekukanali tarbijana konkreetseid toiminguid. Igal eeposel on võime olla ka produtsent, saates toiminguid torujuhtme kaudu.

Kui soovite Redux-Observable'is järjekorda luua nagu CSP, on see pisut keerulisem, kuna operaatorit pole selleks otstarbeks saadaval, kuid see on täiesti võimalik.

Lõin repli, mis teeb just seda:

Võrreldes meie varasema CSP näitega, võite seda oodata:

Näide nõuab ainult RxJS-i ja kõik on lihtsuse huvides ühes failis. Nagu näete, on RxJS-is üksuste järjekorda seadmine sama keeruline kui CSP-l. See on täiesti võimalik, kuid nõuab palju rohkem koodi.

Mulle isiklikult meeldiks, kui RxJS lisaks operaatori nagu puhver, kui see võimaldab kogu puhvri asemel üksikuid üksusi jaotada. Siis saaksite CSP-stiili Redux-Observable'is palju lihtsamini täita.

Järeldus

CSP oli lahe idee, kuid JavaScriptis pole see surnud. Redux-Saga ja Redux-Observable on väärt alternatiivid.

Isegi kui on võimalik integreeruda muundurite raamatukogudega, on RxJS-l endiselt selge eeldus. See on suur haridustöötajate kogukond ja tootmisrakendused raskendavad võistlemist.

Sellepärast ma arvan, et CSP suri JavaScriptis.

Veel loeb

Kui teile meeldis see, mida lugesite, lugege palun minu teisi artikleid sarnastel silmi avavatel teemadel:

  • Reduxi jälgitav võib teie oleku probleeme lahendada
  • Redux - jälgitav ilma Reduxita
  • Tagasihelistamine: lõplik juhend
  • Lubadused: lõplik juhend