CSP vs RxJS: αυτό που δεν ξέρετε.

Τι συνέβη με το CSP;

Φωτογραφία από τον James Pond στο Unsplash

Πιθανότατα κάνατε κλικ σε αυτό το άρθρο σκέπτοντας "τι είναι το CSP;" Είναι η επικοινωνία διαδοχικών διαδικασιών. Ακόμα αμηχανία;

Το CSP είναι μια μέθοδος επικοινωνίας μεταξύ των διαφορετικών λειτουργιών (γεννήτριες) στον κώδικα σας χρησιμοποιώντας κοινόχρηστο κανάλι.

Τι σημαίνει στον κόσμο αυτό; Ο Lemme το λέει σε ευθεία. Υπάρχει αυτή η έννοια ενός καναλιού. Σκεφτείτε το σαν μια ουρά. Μπορείτε να βάλετε τα πράγματα σε αυτό και να πάρετε τα πράγματα από το.

Έτσι, με δύο λειτουργίες, μπορείτε να προσθέσετε ένα υλικό στο κανάλι (παραγωγός) και άλλο να τραβήξετε τα πράγματα μακριά και να κάνετε κάποια εργασία (καταναλωτής).

Μια τυπική περίπτωση προηγμένης χρήσης θα ήταν πολλαπλοί παραγωγοί και ένας καταναλωτής. Με αυτόν τον τρόπο μπορείτε να ελέγχετε τα δεδομένα που λαμβάνετε, αλλά μπορείτε να έχετε πολλά πράγματα που σας το δίνουν.

Σε αντίθεση με το RxJS, αυτά τα κανάλια είναι αυτόματα. Δεν παίρνετε αξίες willy-nilly, πρέπει να τους ζητήσετε.

Χρησιμοποιώντας CSP

Εδώ είναι ένα μικρό παράδειγμα CSP χρησιμοποιώντας την υπερ-απλή (και νεκρά) βιβλιοθήκη Channel4:

Τα κανάλια CSP εκτελούνται ασύγχρονα. Έτσι, μόλις αυτό τρέξει, το συγχρονισμένο μήνυμα "DONE" καταγράφεται πρώτα. Στη συνέχεια, οι ληστές καναλιών εκτελούνται με σειρά.

Το πιο ενδιαφέρον πράγμα για μένα είναι το μπλοκάρισμα (αλλά async) φύση του CSP. Παρατηρήστε πώς δημιουργήσαμε την τρίτη λήψη πριν τοποθετήσετε το "C" στο κανάλι. Σε αντίθεση με τις δύο πρώτες λειτουργίες, ο τρίτος δεν έχει τίποτα να πάρει. Μόλις έρθει κάτι στο κανάλι, το παίρνει αμέσως.

Επίσης, σημειώστε ότι οι καταναλωτές πρέπει να παίρνουν συνεχώς τα πράγματα από το κανάλι έως ότου το κανάλι κλείσει. Αυτός είναι ο λόγος για τον οποίο το "D" δεν καταγράφεται ποτέ. Πρέπει να ορίσετε μια άλλη λήψη για να πάρετε την επόμενη τιμή από το κανάλι.

Με παρατηρητές, σας δίνεται αξία, ώστε να μην χρειάζεται να ανησυχείτε για το χέρι. Εάν θέλετε να αποκαταστήσετε αυτές τις τιμές, το RxJS παρέχει αρκετές μεθόδους αγωγών για τον ίδιο σκοπό. Δεν χρειάζεται να χρησιμοποιήσετε CSP.

Η όλη ιδέα πίσω από τις παρατηρήσεις είναι ότι κάθε ακροατής παίρνει τα ίδια δεδομένα μόλις το καλεί ο παρατηρητής επόμενος. Με τον CSP, είναι σαν την προσέγγιση IxJS όπου ασχολείστε με δεδομένα σε κομμάτια.

Το CSP IS DEAD !?

Μπορείτε να βρείτε εφαρμογές CSP στο Go και το κλείσιμο. Στο JavaScript, όλες οι βιβλιοθήκες CSP εκτός από ζευγάρια είναι νεκροί και ακόμα και τότε το κοινό τους είναι μικρό .

Ανακάλυψα το CSP από την εκπληκτική ομιλία του Vincenzo Chianese. Πρότεινε αυτή τη βιβλιοθήκη high-end που ονομάζεται js-csp. Δυστυχώς, δεν διατηρείται πλέον.

Με βάση αυτό που είπε στην ομιλία του το 2017, φαινόταν σαν μια μεγάλη υπόθεση. Μίλησε για το πώς οι μετατροπείς επρόκειτο να εκραγούν σε λίγους μήνες και πώς η js-csp είχε ήδη υποστήριξη γι 'αυτούς.

Φαινόταν ότι το CSP θα μπορούσε να αλλάξει θεμελιωδώς τον τρόπο με τον οποίο αναπτύξατε τις εφαρμογές async στο JavaScript. Αλλά τίποτα από αυτά δεν συνέβη ποτέ. Οι μεταγωγείς πέθαναν. αντικαταστάθηκαν από βιβλιοθήκες όπως το RxJS και η δημοσιότητα γύρω από το CSP διαλύθηκε.

Ο Vincenzo σημείωσε πως το CSP είναι ένα ολόκληρο επίπεδο πάνω από τις υποσχέσεις. Εχει δίκιο. Η ισχύς που παίρνετε έχοντας πολλές λειτουργίες που αλληλεπιδρούν ασύγχρονα είναι απίστευτη.

Οι υποσχέσεις, με την ανυπομονησία τους, δεν είναι καν στο ίδιο πάρκο. Λίγη γνώριζε ότι οι τελευταίες βιβλιοθήκες του CSP θα κατέληγαν στη στήριξη υποσχέσεων κάτω από την κουκούλα .

Εναλλακτική λύση CSP: Redux-Saga

Εάν έχετε χρησιμοποιήσει ποτέ το Redux-Saga, οι ιδέες και οι έννοιες γύρω από το CSP μοιάζουν πιθανώς γνωστές. Αυτό συμβαίνει γιατί είναι. Στην πραγματικότητα, το Redux-Saga είναι μια εφαρμογή του CSP στο JavaScript. το πιο δημοφιλές από μακριά.

Υπάρχει ακόμη και μια έννοια των "καναλιών" στο Redux-Sagas:
https://github.com/redux-saga/redux-saga/blob/master/docs/advanced/Channels.md

Τα κανάλια λαμβάνουν πληροφορίες από εξωτερικά συμβάντα, ενέργειες buffer στο κατάστημα Redux και επικοινωνούν μεταξύ δύο saga. Είναι ο ίδιος τρόπος που χρησιμοποιούνται στο CSP με τις ίδιες λειτουργίες λήψης και θέσης.

Αρκετά δροσερό για να δείτε μια πραγματική εφαρμογή του CSP στο JavaScript, αλλά παράξενο πολύ λίγοι το έχουν παρατηρήσει. Αυτό σας δείχνει πόσο λίγο CSP απογειώθηκε πριν πεθάνει.

Εναλλακτική λύση CSP: Redux-Observable

Μπορεί να έχετε ακούσει κάτι που ονομάζεται Redux-Obsible. Αυτή είναι μια παρόμοια ιδέα με την CSP και την Redux-Saga, αλλά αντί του επιτακτικού στυλ των γεννητριών, παίρνει μια λειτουργική προσέγγιση και χρησιμοποιεί αγωγούς RxJS που αναφέρονται ως "έπιπλα".

Στο Redux-Obspectable, όλα συμβαίνουν μέσα από δύο θέματα: action $ και state $. Αυτά είναι τα κανάλια σας.

Αντί να παίρνετε χειροκίνητα και να βάζετε, ακούτε για συγκεκριμένες ενέργειες ως καταναλωτές μιας δράσης ή ενός κρατικού καναλιού. Κάθε έπος έχει την ικανότητα να είναι επίσης παραγωγός με την αποστολή ενεργειών μέσω του αγωγού.

Αν θέλετε να δημιουργήσετε μια ουρά στο Redux-Obstable όπως το CSP, είναι λίγο πιο περίπλοκο καθώς δεν υπάρχει διαθέσιμος φορέας για το σκοπό αυτό, αλλά είναι απολύτως εφικτό.

Δημιούργησα ένα repl που κάνει ακριβώς αυτό:

Σε σύγκριση με το παλαιότερο παράδειγμα CSP, αυτό είναι που μπορείτε να περιμένετε να δείτε:

Το παράδειγμα απαιτεί μόνο RxJS και όλα είναι σε ένα αρχείο για λόγους απλότητας. Όπως μπορείτε να δείτε, είναι πολύ πιο δύσκολο να τοποθετήσετε αναμονή σε αντικείμενα στο RxJS όπως θα κάνατε με το CSP. Είναι απολύτως εφικτό, αλλά απαιτεί πολύ περισσότερο κώδικα.

Προσωπικά, θα ήθελα πολύ να δω το RxJS να προσθέσει έναν χειριστή σαν buffer.Όταν αυτό σας επιτρέπει να ξεδιπλώσετε μεμονωμένα αντικείμενα αντί για ολόκληρο το buffer. Στη συνέχεια, θα μπορούσατε να επιτύχετε το στυλ CSP στο Redux-Obspect πολύ πιο εύκολο.

συμπέρασμα

Το CSP ήταν μια δροσερή ιδέα, αλλά είναι νεκρή στο JavaScript. Το Redux-Saga και το Redux-Obsible είναι αξιόλογες εναλλακτικές λύσεις.

Ακόμη και με την ικανότητα ενσωμάτωσης με τις βιβλιοθήκες των μετατροπέων, το RxJS εξακολουθεί να έχει ένα σαφές πόδι-up. Είναι μια μαζική κοινότητα εκπαιδευτικών και οι εφαρμογές παραγωγής καθιστούν δύσκολο τον ανταγωνισμό.

Γι 'αυτό πιστεύω ότι ο CSP πέθανε στο JavaScript.

Διαβάστε περισσότερα

Αν σας άρεσε αυτό που έχετε διαβάσει, παρακαλώ συμπληρώστε τα άλλα μου άρθρα σχετικά με παρόμοια θέματα που ανοίγουν τα μάτια:

  • Το Redux-Obspectable μπορεί να λύσει τα κρατικά σας προβλήματα
  • Redux-Observed χωρίς Redux
  • Επανακλήσεις: Ο Οριστικός Οδηγός
  • Υποσχέσεις: Ο Οριστικός Οδηγός