CSP vs RxJS: co nevíte.

Co se stalo s CSP?

Foto James Pond na Unsplash

Pravděpodobně jste klikli na tento článek a přemýšleli „co je to CSP?“ Komunikují to sekvenční procesy. Pořád zmaten?

CSP je metoda komunikace mezi různými funkcemi (generátory) v kódu pomocí sdíleného kanálu.

Co to na světě znamená? Lemme to řekni rovně. Existuje koncept kanálu. Myslete na to jako na frontu. Můžete si na to dát věci a sundat je.

Takže se dvěma funkcemi, můžete mít jednu přidávat věci na kanálu (producent) a další stahovat věci a dělat nějakou práci (spotřebitel).

Typickým případem pokročilého použití by bylo více výrobců a jeden spotřebitel. Tímto způsobem můžete ovládat získaná data, ale můžete jim dát více věcí.

Na rozdíl od RxJS jsou tyto kanály automatické. Hodnoty nedostanete ochotně, ale musíte o ně požádat.

Používání CSP

Zde je malý příklad CSP používající super jednoduchou (a mrtvou) knihovnu Channel4:

Kanály CSP běží asynchronně. Jakmile je spuštěna, synchronní zpráva „DONE“ bude nejprve zaznamenána. Poté jsou naši odběratelé kanálu popraveni v pořádku.

Nejzajímavější pro mě je blokovací (ale asynchronní) povaha CSP. Všimněte si, jak jsme vytvořili třetí záběr před vložením „C“ do kanálu. Na rozdíl od prvních dvou funkcí take, třetí nemá co vzít. Jakmile se něco dostane do kanálu, okamžitě to vezme.

Také si všimněte, že spotřebitelé musí neustále odstraňovat věci z kanálu, dokud se tento kanál nezavře. To je důvod, proč „D“ není nikdy přihlášeno. Pro definování další hodnoty z kanálu musíte definovat další odběr.

S pozorovatelnými jsou vám dány hodnoty, takže se nemusíte obávat, že je ručně stáhnete. Pokud chcete tyto hodnoty uložit do vyrovnávací paměti, poskytuje RxJS pro tento účel poměrně málo metod potrubí. Není třeba používat CSP.

Celý koncept za pozorovatelnými je, že každý posluchač dostane stejná data, jakmile pozorovatel zavolá další. S CSP je to jako přístup IxJS, kde pracujete s daty v blocích.

CSP JE DEAD !?

Implementace CSP najdete v Go and Closure. V JavaScriptu jsou všechny knihovny CSP kromě několika mrtvých a dokonce i jejich publikum je malé .

Dozvěděl jsem se o CSP z úžasné řeči Vincenza Chianese. Doporučil tuto špičkovou knihovnu s názvem js-csp. Je smutné, že se již neudržuje.

Na základě toho, co řekl ve svém projevu v roce 2017, se to zdálo jako velký problém. Mluvil o tom, jak budou sondy explodovat za pár měsíců a jak js-csp už pro ně měl podporu.

Vypadalo to, že CSP by mohl zásadně změnit způsob, jakým jste vyvíjeli asynchronní aplikace v JavaScriptu. Ale nic z toho se nikdy nestalo. Převodníky zemřely; nahrazeny knihovnami jako RxJS a humbuk kolem CSP rozpuštěn.

Vincenzo si všiml toho, jak je CSP o celou úroveň vyšší než sliby. On má pravdu. Síla, kterou získáte s více funkcemi asynchronní interakce, je neuvěřitelná.

Sliby, díky své dychtivé povaze, nejsou ani ve stejném parkovišti. Trochu věděl, že posledních pár knihoven CSP skončí podporováním slibů pod kapotou .

Alternativa CSP: Redux-Saga

Pokud jste někdy použili Redux-Saga, nápady a koncepty kolem CSP pravděpodobně znějí povědomě. To proto, že jsou. Redux-Saga je ve skutečnosti implementací CSP v JavaScriptu; nejoblíbenější zdaleka.

V Redux-Sagas je dokonce koncept „kanálů“:
https://github.com/redux-saga/redux-saga/blob/master/docs/advanced/Channels.md

Kanály přijímají informace z externích událostí, akce vyrovnávací paměti do úložiště Redux a komunikují mezi dvěma ságy. Je to stejný způsob, jakým jsou používány v CSP se stejnými funkcemi take and put.

Je docela v pohodě vidět skutečnou implementaci CSP v JavaScriptu, ale podivné velmi málo si toho všimlo. To ukazuje, jak málo CSP vzlétlo před smrtí.

CSP Alternative: Redux-Pozorovatelné

Možná jste slyšeli o něčem, co se jmenuje Redux-Observable. Jedná se o podobný koncept jako CSP a Redux-Saga, ale namísto imperativního stylu generátorů vyžaduje funkční přístup a využívá potrubí RxJS označované jako „epos“.

V Redux-Observable, všechno se děje prostřednictvím dvou předmětů: akce $ a stát $. To jsou vaše kanály.

Místo ručního pořizování a vkládání posloucháte konkrétní akce jako spotřebitel akce nebo státního kanálu. Každé epos má schopnost být také producentem zasláním akcí potrubím.

Pokud chcete postavit frontu v Redux-Observable stejně jako CSP, je to o něco složitější, protože pro tento účel není k dispozici žádný operátor, ale je to zcela možné.

Vytvořil jsem odpověď, která právě dělá:

Ve srovnání s naším předchozím příkladem CSP můžete očekávat toto:

Příklad vyžaduje pouze RxJS a pro jednoduchost je vše v jednom souboru. Jak vidíte, je mnohem těžší zařazovat položky do RxJS do fronty stejným způsobem jako u CSP. Je to zcela možné, ale vyžaduje mnohem více kódu.

Osobně bych rád viděl RxJS přidat operátora, jako je bufferWhen, který vám umožní rozdělit jednotlivé položky namísto celého bufferu. Pak byste mohli mnohem lépe dosáhnout stylu CSP v Redux-Observable.

Závěr

CSP byl skvělý koncept, ale v JavaScriptu je mrtvý. Redux-Saga a Redux-Observable jsou hodnotné alternativy.

I přes schopnost integrace s knihovnami převodníků má RxJS stále jasnou orientaci. Je to obrovská komunita pedagogů a produkčních aplikací, což ztěžuje konkurenci.

Proto si myslím, že CSP zemřel v JavaScriptu.

Další čtení

Pokud se vám líbilo to, co jste četli, podívejte se na mé další články o podobných tématech otevírajících oči:

  • Pozorovatelný Redux může vyřešit vaše státní problémy
  • Redux - pozorovatelné bez Reduxu
  • Zpětná volání: Definitivní příručka
  • Slibuje: Definitivní průvodce