CSP vs RxJS: чаго не ведаеш.

Што здарылася з CSP?

Фота Джэймса Пондса на Unsplash

Вы, напэўна, націснулі на гэты артыкул, думаючы, "што такое CSP?". Ён паведамляе паслядоўныя працэсы. Яшчэ разгублена?

CSP - гэта спосаб зносін паміж рознымі функцыямі (генератарамі) вашага кода пры дапамозе агульнага канала.

Што ў свеце гэта значыць? Лемма, скажыце гэта вам проста. Там ёсць такая канцэпцыя канала. Падумайце пра гэта як пра чаргу. Вы можаце пакласці на яго рэчы і зняць рэчы.

Такім чынам, пры дапамозе дзвюх функцый вы зможаце дадаць рэчы на ​​канале (вытворцы), а яшчэ адну выцягнуць і выканаць нейкую працу (спажывец).

Тыповы выпадак пашыранага выкарыстання можа быць некалькі вытворцаў і адзін спажывец. Такім чынам вы можаце кантраляваць атрыманыя дадзеныя, але вы можаце даць ім некалькі рэчаў.

У адрозненне ад RxJS, гэтыя каналы аўтаматычныя. Вы не атрымліваеце значэння воляй-няволяй, трэба прасіць іх.

Выкарыстанне CSP

Вось невялікі прыклад CSP з выкарыстаннем супер простай (і мёртвай) бібліятэкі Channel4:

Каналы CSP працуюць асінхронна. І як толькі гэта запускаецца, сінхроннае паведамленне "СКАЧАЦЬ" атрымлівае рэгістрацыю. Тады нашы карыстальнікі каналаў выконваюцца ў парадку.

Самае цікавае для мяне - блакавальны (але асінхронны) характар ​​CSP. Звярніце ўвагу, як мы стварылі трэці ход, перш чым пакласці "C" на канал. У адрозненне ад першых дзвюх функцый здымкі, у трэцяй нічога нельга браць. Як толькі нешта трапляе ў канал, ён адразу прымае яго.

Таксама звярніце ўвагу, спажыўцам трэба пастаянна здымаць рэчы з канала, пакуль гэты канал не зачыніцца. Вось чаму "D" ніколі не рэгіструецца. Вам трэба вызначыць іншае ўзяць, каб захапіць наступнае значэнне з канала.

З назіраннямі вам прысвоены значэнні, і вам не прыйдзецца турбавацца аб тым, каб зняць іх уручную. Калі вы хочаце загрузіць гэтыя значэнні, RxJS забяспечвае мноства метадаў канвеера менавіта з гэтай мэтай. Не трэба выкарыстоўваць CSP.

Уся канцэпцыя назірання заключаецца ў тым, што кожны слухач атрымлівае аднолькавыя дадзеныя, як толькі назіральнік тэлефануе наступным. Што тычыцца CSP, гэта падобны на падыход IxJS, дзе вы маеце справу з кавалкамі.

CSP СТАРЫ !?

Вы можаце знайсці рэалізацыі CSP у раздзеле "Перайсці і закрыццё". У JavaScript усе бібліятэкі, акрамя пары CSP, ужо памерлі, і нават тады іх аўдыторыя невялікая.

Я даведаўся пра CSP па дзіўных размовах Вінчэнца Чыанэса. Ён рэкамендаваў гэтую бібліятэку высокага класа пад назвай js-csp. На жаль, яго больш не падтрымліваюць.

Зыходзячы з таго, што ён сказаў у размове за 2017 год, гэта здавалася вялікай справай. Ён распавёў пра тое, як датчыкі збіраліся выбухнуць за некалькі месяцаў і як js-csp ужо аказаў ім падтрымку.

Выглядала, што CSP можа кардынальна змяніць тое, як вы распрацоўвалі прыкладання async у JavaScript. Але нічога такога ніколі не было. Датчыкі памерлі; заменены бібліятэкамі, як RxJS, і ажыятаж вакол CSP скасаваны.

Вінчэнца заўважыў, як CSP знаходзіцца на цэлым узроўні вышэй за абяцанні. Ён мае рацыю. Магутнасць, якую вы атрымліваеце з асінхронным узаемадзеяннем некалькіх функцый, неверагодная.

Абяцанні, па сваёй жаданні, нават не знаходзяцца ў адным месцы. Мала што ён ведаў, што апошнія некалькі бібліятэк CSP будуць падтрымліваць абяцанні under.

Альтэрнатыва CSP: Redux-Saga

Калі вы калі-небудзь выкарыстоўвалі Redux-Saga, ідэі і канцэпцыі вакол CSP, верагодна, гучаць знаёма. Гэта таму, што яны ёсць. На самай справе, Redux-Saga - гэта рэалізацыя CSP у JavaScript; самы папулярны на сённяшні дзень.

У Рэдукс-Сазе ёсць нават паняцце "каналы":
https://github.com/redux-saga/redux-saga/blob/master/docs/advanced/Channels.md

Каналы атрымліваюць інфармацыю ад знешніх падзей, буферных дзеянняў у краме Redux і размаўляюць паміж двума сагамі. Гэта тое ж самае, што яны выкарыстоўваюць у CSP з аднолькавымі функцыямі "прыняць і паставіць".

Даволі крута бачыць рэальную рэалізацыю CSP у JavaScript, але дзіўна мала хто гэта заўважыў. Гэта паказвае вам, як мала ДСП ўзлятала перад смерцю.

Альтэрнатыва CSP: Рэдукс-назіранне

Вы маглі б пачуць пра тое, што называецца Redux-Opable. Гэтая канцэпцыя падобная на CSP і Redux-Saga, але замест неабходнага стылю генератараў ён выкарыстоўвае функцыянальны падыход і выкарыстоўвае трубаправоды RxJS, званыя "эпас".

У Redux-Oservable усё адбываецца праз дзве тэмы: дзеянне $ і стан $. Гэта вашы каналы.

Замест таго, каб уручную рабіць і ставіць, вы слухаеце канкрэтныя дзеянні як спажывец дзеяння альбо дзяржаўны канал. Кожны эпас таксама можа быць прадзюсарам, адпраўляючы дзеянні па канвееры.

Калі вы хочаце стварыць чаргу ў Redux-Observable, як CSP, гэта некалькі складаней, бо для гэтага няма аператара, але гэта цалкам магчыма.

Я стварыў адбітак, які робіць менавіта гэта:

У параўнанні з папярэднім прыкладам ДСП, вы можаце разлічваць:

У прыкладзе патрабуецца толькі RxJS і ўсё ў адным файле для прастаты. Як бачыце, усталяваць у чарзе элементы ў RxJS значна складаней, як і CSP. Гэта цалкам магчыма, але патрабуецца значна больш кода.

Асабіста я хацеў бы бачыць, як RxJS дадасць такі аператар, як буфер. Калі вы можаце раздзяляць асобныя элементы замест усяго буфера. Тады вы маглі б дасягнуць стылю CSP у Redux-Observable нашмат прасцей.

Выснова

CSP - гэта крутая канцэпцыя, але ў JavaScript яна памерла. Redux-Saga і Redux-Observable - вартыя альтэрнатывы.

Нават маючы магчымасць інтэграцыі з бібліятэкамі пераўтваральнікаў, RxJS па-ранейшаму мае выразныя ногі. Гэта вялікая супольнасць педагогаў і вытворчых прыкладанняў складана канкурыраваць.

Вось чаму я думаю, што CSP памёр у JavaScript.

Больш чытанняў

Калі вам спадабалася тое, што вы прачыталі, калі ласка, азнаёмцеся з іншымі маімі артыкуламі на падобныя тэмы:

  • Рэдукс-назіранне можа вырашыць вашы праблемы з дзяржавай
  • Рэдукс-назіральны без Redux
  • Зваротныя звароты: Канчатковае кіраўніцтва
  • Абяцанні: Канчатковае кіраўніцтва