CSP vs RxJS: Was Sie nicht wissen.

Was ist mit CSP passiert?

Foto von James Pond auf Unsplash

Sie haben wahrscheinlich auf diesen Artikel geklickt und gedacht, "Was ist CSP?" Es kommuniziert sequentielle Prozesse. Immer noch ratlos?

CSP ist eine Methode zur Kommunikation zwischen verschiedenen Funktionen (Generatoren) in Ihrem Code über einen gemeinsam genutzten Kanal.

Was in aller Welt heißt das? Ich muss es dir gerade sagen. Es gibt dieses Konzept eines Kanals. Stellen Sie es sich wie eine Warteschlange vor. Sie können Dinge darauf ablegen und Dinge davon entfernen.

Mit zwei Funktionen können Sie also festlegen, dass eine Komponente dem Kanal hinzugefügt wird (Produzent) und eine andere Komponente Dinge entfernt und Arbeit erledigt (Konsument).

Ein typischer fortgeschrittener Anwendungsfall wären mehrere Hersteller und ein Verbraucher. Auf diese Weise können Sie die Daten kontrollieren, die Sie erhalten, aber Sie können mehrere Dinge haben, die es Ihnen geben.

Im Gegensatz zu RxJS erfolgen diese Kanäle automatisch. Du bekommst keine Werte, du musst sie verlangen.

CSP verwenden

Hier ist ein kleines CSP-Beispiel mit der supereinfachen (und toten) Bibliothek Channel4:

CSP-Kanäle werden asynchron ausgeführt. Sobald dies ausgeführt wird, wird die synchrone Meldung "DONE" zuerst protokolliert. Dann werden unsere Channel Taker der Reihe nach ausgeführt.

Das interessanteste für mich ist die blockierende (aber asynchrone) Natur von CSP. Beachten Sie, wie wir den dritten Take erstellt haben, bevor Sie „C“ in den Kanal einfügen. Im Gegensatz zu den ersten beiden Take-Funktionen hat die dritte Funktion nichts zu übernehmen. Sobald etwas in den Kanal kommt, nimmt es es sofort auf.

Beachten Sie auch, dass Verbraucher ständig Dinge aus dem Kanal entfernen müssen, bis dieser Kanal schließt. Aus diesem Grund wird "D" niemals protokolliert. Sie müssen einen anderen Take definieren, um den nächsten Wert vom Kanal abzurufen.

Mit Observables erhalten Sie Werte, sodass Sie sich nicht darum kümmern müssen, diese manuell abzurufen. Wenn Sie diese Werte puffern möchten, bietet RxJS zu diesem Zweck einige Pipeline-Methoden. CSP muss nicht verwendet werden.

Das gesamte Konzept hinter Observables ist, dass jeder Zuhörer die gleichen Daten erhält, sobald der Beobachter das nächste Mal anruft. Mit CSP ist es wie mit dem IxJS-Ansatz, bei dem Sie mit Daten in Blöcken arbeiten.

CSP IST TOT !?

Sie finden CSP-Implementierungen in Go and Closure. In JavaScript sind alle bis auf ein paar CSP-Bibliotheken tot, und selbst dann ist ihre Zielgruppe klein .

Ich habe von Vincenzo Chianes großartigem Vortrag über CSP erfahren. Er empfahl diese High-End-Bibliothek mit dem Namen js-csp. Leider wird es nicht mehr gepflegt.

Basierend auf dem, was er in seinem Vortrag 2017 sagte, schien es eine große Sache zu sein. Er sprach darüber, wie die Schallköpfe in ein paar Monaten explodieren würden und wie js-csp bereits Unterstützung für sie hatte.

Es sah so aus, als ob CSP die Entwicklung von asynchronen Anwendungen in JavaScript grundlegend verändern könnte. Aber nichts davon ist jemals passiert. Wandler starben ab; ersetzt durch Bibliotheken wie RxJS, und der Hype um CSP löste sich auf.

Vincenzo bemerkte, dass CSP eine ganz andere Ebene über den Versprechungen ist. Er hat recht. Die Leistung, mit der mehrere Funktionen asynchron interagieren, ist unglaublich.

Versprechen sind von Natur aus nicht einmal im gleichen Stadion. Wenig wusste er, dass die letzten CSP-Bibliotheken letztendlich verdeckte Versprechungen unterstützen würden .

CSP-Alternative: Redux-Saga

Wenn Sie Redux-Saga jemals verwendet haben, sind Ihnen die Ideen und Konzepte von CSP wahrscheinlich vertraut. Das liegt daran, dass sie es sind. Tatsächlich ist Redux-Saga eine Implementierung von CSP in JavaScript. das mit Abstand beliebteste.

Es gibt sogar ein Konzept von "Kanälen" in Redux-Sagas:
https://github.com/redux-saga/redux-saga/blob/master/docs/advanced/Channels.md

Kanäle empfangen Informationen von externen Ereignissen, puffern Aktionen an den Redux-Speicher und kommunizieren zwischen zwei Sagen. Es ist dieselbe Art und Weise, wie sie in CSP mit denselben Take-and-Put-Funktionen verwendet werden.

Es ist ziemlich cool, eine tatsächliche Implementierung von CSP in JavaScript zu sehen, aber nur sehr wenige haben es bemerkt. Das zeigt Ihnen, wie wenig CSP vor dem Tod abgehoben hat.

CSP-Alternative: Redux-Observable

Möglicherweise haben Sie von etwas namens Redux-Observable gehört. Dies ist ein ähnliches Konzept wie CSP und Redux-Saga, verwendet jedoch anstelle des zwingenden Stils von Generatoren einen funktionalen Ansatz und RxJS-Pipelines, die als „Epics“ bezeichnet werden.

In Redux-Observable geschieht alles über zwei Subjekte: action $ und state $. Das sind deine Kanäle.

Anstatt manuell zu nehmen und zu setzen, warten Sie als Konsument eines Aktions- oder Statuskanals auf bestimmte Aktionen. Jedes Epos hat die Fähigkeit, auch Produzent zu sein, indem es Aktionen über die Pipeline sendet.

Wenn Sie in Redux-Observable genau wie in CSP eine Warteschlange erstellen möchten, ist dies etwas komplizierter, da für diesen Zweck kein Operator verfügbar ist, dies jedoch durchaus möglich ist.

Ich habe eine Antwort erstellt, die genau das macht:

Im Vergleich zu unserem früheren CSP-Beispiel können Sie Folgendes erwarten:

Für das Beispiel ist nur RxJS erforderlich, und der Einfachheit halber befindet sich alles in einer einzigen Datei. Wie Sie sehen, ist es sehr viel schwieriger, Elemente in RxJS in die Warteschlange zu stellen, wie Sie es mit CSP tun könnten. Dies ist durchaus möglich, erfordert jedoch viel mehr Code.

Persönlich würde ich gerne sehen, dass RxJS einen Operator wie bufferWhen hinzufügt, mit dem Sie einzelne Elemente anstelle des gesamten Puffers aufteilen können. Dann könnten Sie den CSP-Stil in Redux-Observable viel einfacher umsetzen.

Fazit

CSP war ein cooles Konzept, aber es ist in JavaScript nicht mehr vorhanden. Redux-Saga und Redux-Observable sind würdige Alternativen.

Trotz der Möglichkeit, sich in Wandlerbibliotheken zu integrieren, hat RxJS immer noch einen klaren Vorsprung. Es ist eine riesige Community von Pädagogen und Produktionsanwendungen, die den Wettbewerb erschwert.

Aus diesem Grund ist CSP meiner Meinung nach in JavaScript gestorben.

Mehr liest

Wenn Ihnen das, was Sie gelesen haben, gefallen hat, lesen Sie bitte meine anderen Artikel zu ähnlichen aufschlussreichen Themen:

  • Redux-Observable kann Ihre staatlichen Probleme lösen
  • Redux-Observable ohne Redux
  • Rückrufe: Der definitive Leitfaden
  • Versprechen: Der definitive Leitfaden