ãã®èšäºã§ã¯ãRxJS 5+ãããžã§ã¯ããããŒãžã£ãŒã§ããGoogleãšã³ãžãã¢ã®
Ben Leshãšã®ã€ã³ã¿ãã¥ãŒã®ç¿»èš³ãå
±æããŸãã
ããã³ããšã³ãéçºã®åºå€§ãªäžçã«ã¯ãå€ãã®èå³æ·±ãããŒã«ããããŸãã ç§ã¯å®è·µçãªããšãåŠã¶ããã®æ£ããã¢ãããŒããèŠã€ããããåªããŠãããRxJSã³ãã¥ããã£ã®æãèåãªä»£è¡šè
ã®1人ã§ããBen Leshãšè©±ãããããšã«ããŸããã RxJSã«ã€ããŠãã£ãšç¥ããããšæã£ãã®ã§ããããªãåå¿è
ã®éçºè
ããªã¢ã¯ãã£ãããã°ã©ãã³ã°ã®åŠç¿ã«æéãè²»ããã¹ããªã®ã§ããããã ããã«ããããžã§ã¯ãã§RxJSã䜿çšããçç±ãç解ãããã£ãã®ã§ãã Benã¯RxJSã®äœ¿çšæ¹æ³ãæããŠããããã®ãã¯ãããžãŒã«ã€ããŠåŠã¶ããã®ãã³ããå
±æããŸããã
RxJSã¯ã©ã®ãããªåé¡ã解決ããŸããïŒ
ããã°ã©ãã³ã°ã¯åžžã«åé¡ã®è§£æ±ºçã§ãããç¹å®ã®è³ªåã«å¯ŸããçããèŠã€ããã®ã«é©ããããŒã«ã®æ€çŽ¢ã§ãã RxJSã®å Žåã解決ãã¹ãã¿ã¹ã¯ã¯ãããŸããŸãªã€ãã³ãã䜿çšããŠéåæåŒã³åºããåŠçããæ©èœã§ãã ããã¯ãããã«è©³ãã説æãã䟡å€ããããŸãã
ããŒã¿ã䜿çšããŠç¹å®ã®ã¢ã¯ã·ã§ã³ã·ãŒã±ã³ã¹ãçæããé¢æ°ãäœæããŠãããšãã«ããã®äœæ¥äžã«ãšã©ãŒãçºçãããšããŸãã é¢æ°ã䜿çšããŠãªã¯ãšã¹ãã®ã·ãŒã±ã³ã¹ãåŠçããã ãã®å Žåããšã©ãŒãè¿ãããã«ããã€ãã®ãªãã·ã§ã³ã®æé ãå®è¡ãããå ŽåããããŸãã ãšã©ãŒããã¹ãŠã®é¢æ°ã«æž¡ãã®ã§ã¯ãªããäžèŠã«ãªã£ããã¹ãŠã®Ajaxãªã¯ãšã¹ããçµç±ããã«ãšã©ãŒãååŸããŠãã¥ãŒãæŽæ°ã§ããå¿
èŠããããŸãã
ãã®ã¹ã¿ã€ã«ã§ãšã©ãŒåŠçãæŽçããããã«ãããã¹ãäœæãããããšã«æ°ã¥ããããããŸããããRxJSã¯ã·ãŒã±ã³ã·ã£ã«ã¢ã¯ã·ã§ã³ãæ°ããã¬ãã«ã§æäœãããšããæŠå¿µãæ¡çšããŠããŸãã Promisã¯åäžã®å€ã®ã¿ãåŠçã§ããããããã®æ§æã®ãŠãŒã¹ã±ãŒã¹ãå¶éãããŸãã ããã«å ããŠãçŽæããã£ã³ã»ã«ããããšã¯ã§ããŸãããã€ãŸãããããŒãéåžžã«ããŸããããã¯ããŠãªãœãŒã¹ã浪費ããå¯èœæ§ããããŸãïŒäœé»åããã€ã¹ã®éèŠãªèæ
®äºé
ïŒã
察ç
§çã«ãRxJSã¯è€æ°ã®éä¿¡ãã£ãã«ãæäŸããããšã§ãããã®å¶éãæé€ããæ¹æ³ãæäŸããŸããããã«ããããã«ãã¹ãããã€ãã³ãã®åŠçãç°¡çŽ åãããå¹çãåäžããŸãã ããã«ãRxJSã䜿çšãããšãéçºè
ã¯ã€ãã³ããçæããå¿
èŠããããã¹ãŠã®ãã®ãåäžã«è¡šçŸã§ããŸãã ãã¹ãŠãåãã«èŠããå Žåããªã¯ãšã¹ãã®çµåãçµåãå®è¡ã®ãã¹ãŠãç°¡åã«åŠçã§ããããšãããããŸãã ããã«ãããRxJSã¯éåžžã«åŒ·åãªããŒã«ã«ãªããŸãã
RxJSãåŠã¶çç±
äžæ¹ã§ãRxJSã¯ãè€éãªäžé£ã®ã¢ã¯ã·ã§ã³ãç°¡åã«æäœã§ããç°¡æœãªã³ãŒãã«å€æã§ãã匷åãªããŒã«ã§ãã
äžæ¹ããã®åçŽãã¯å€ãã®èšèªã¡ã«ããºã ã«åºã¥ããŠããããããã®ç 究ã«ã¯æéãããããŸãã ãã ãã1è¡ã®ã³ãŒãã§3ã»ããã®ã€ãã³ããå¿
èŠãšãããã©ãã°ã¢ã³ãããããã¡ã«ããºã ãå®è£
ãããããªããšãã§ããããšã«æ°ä»ãããšããåŸãããç¥èã¯åªåãã䟡å€ããããŸãã
ããã«ããããããã®ã€ãã³ããäžç·ã«æ¥ç¶ããŠïŒããŠã¹ãã¿ã³ã®ã¯ãªãã¯ãããŠã¹ã®ç§»åããã¿ã³ã®ãªãªãŒã¹ïŒãçãæ£ç¢ºãª1è¡ã®ã³ãŒããååŸã§ããŸãã éåžžã®ã¢ãããŒãã§ã¯ãããã«ã¯æ°åè¡ã®ããã°ã©ã ãå¿
èŠã§ãã
RxJSã䜿çšããå©ç¹ã¯äœã§ããïŒ
RxJSãã³ãŒãã«çµ±åãããšãã«éãããæãé
åçãªæ©äŒã®1ã€ã¯ãRxJSã䜿çšããã°ããã»ã©ããã®ãã¯ãããžãŒã§ã§ããããšã§ãã RxJSã¯ããã¹ãŠã®ãã¥ãŒããåã圢ç¶ã§ãããããã¬ãŽãæ°ãããã¶ã€ã³ã®éçºã«æé©ã§ãããšããæå³ã§ãã¬ãŽã³ã³ã¹ãã©ã¯ã¿ãŒãšæ¯èŒã§ããŸãã åæ§ã«ã芳å¯ããããªããžã§ã¯ãã¯ãã¹ãŠåãããã«èŠãããããå€ãã®èå³æ·±ããœãªã¥ãŒã·ã§ã³ãè©Šãããšãã§ããããããããã䜿çšããŠäœããäœæããããšã¯é
åçãªã¿ã¹ã¯ã«ãªããŸãã ã³ãŒãå
ã§èŠ³å¯ããããªããžã§ã¯ããããå€ã䜿çšããã»ã©ãæ¢åã®æ§é ã«åºã¥ããŠæ°ããäœããäœæããæ©äŒãå¢ããŸãã
ç£èŠå¯Ÿè±¡ã®ãªããžã§ã¯ãã倧ããªã³ãŒãããŒã¹ã«çµ±åããããã»ã¹ã¯äœã§ããïŒ
芳å¯ããããªããžã§ã¯ãã¯ãã»ãšãã©ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšã§ããŸãã ããŒã éçºã«ã€ããŠè©±ããŠããå Žåãããã«ã¯æéããããããšããããŸããã次ã®æ¡ä»¶ãæºããããŠããå Žåã移è¡ãç°¡çŽ åã§ããŸãã
- äœæ¥ã¯ãã·ã³ãã«ã§é©åãªãªãã¶ãŒããã«ãªããžã§ã¯ãã®äœ¿çšããå§ãŸããŸãã
- å€æŽã¯ååã«ã³ã¡ã³ããããŠããŸãã
- åããŒã ã¡ã³ããŒã«ã¯ãå®è¡ãããã¢ã¯ã·ã§ã³ã®æå³ãéç¥ãããŸãã
誰ããèªåã®ããŒã¹ã§ãã®ãããªããšãç¿åŸããŸãããæçµçã«ãããŒã ãRxã§ãã¹ãŠãè¡ã£ãŠããããšã«æ°ä»ããŠãé©ããªãã§ãã ããã ç£èŠå¯Ÿè±¡ã®ãªããžã§ã¯ãã䜿çšããŠç¹å®ã®ã¢ã¯ã·ã§ã³ãå®è¡ãããšããããã¯ãã¹ãŠåãããã«èŠããŸããã¢ããªã±ãŒã·ã§ã³ã«é¡äŒŒãããªããžã§ã¯ãã衚瀺ãããããã«ãªããšããããã䜿çšããæ¹ãã¯ããã«èå³æ·±ãã§ãã
ãªãã¶ãŒããã«ãªããžã§ã¯ãã®äœ¿çšãæšå¥šãããªãç¶æ³ã¯ãããŸããïŒ
ãã¡ãããããŸãïŒ JSããã°ã©ãã³ã°ã§ããããããšã§ãããåäžã®ã¢ã¯ã·ã§ã³ãå®è¡ããå¥ã®ã€ãã³ããããå ŽåãRxJSã®äœ¿çšã¯å°ãå¥åŠã§ãã ãã¡ãããããã§ã¯RxJSãé©çšã§ããŸãããããéãã«ãªããŸãã
ãã©ãã°ã¢ã³ãããããæäœã¯ãRxJSãçæ³çã«é©ããŠããã¿ã¹ã¯ã®åªããäŸã§ãã ããã¯å€ãã®ã¢ã¯ã·ã§ã³ã䌎ãã€ãã³ãã§ãããå¯èœã§ããã°ããã®è€éãã¯åžžã«è»œæžããã®ã«åœ¹ç«ã¡ãŸãã
ãªãã¶ãŒããã«ãªããžã§ã¯ãã䜿çšããã¿ã€ãã³ã°ãç解ããæ¹æ³
ã³ã³ããã¹ãã«åºã¥ããŠãç£èŠå¯èœãªãªããžã§ã¯ãã䜿çšãããã©ããã決å®ãããšãã«åœ¹ç«ã¡ãŸãã äŸïŒ
- ç¹å®ã®ã¢ã¯ã·ã§ã³ãè€æ°ã®ã€ãã³ããåŒãèµ·ããå Žå-RxJSã䜿çšããŸãã
- éåææäœãå€æ°ããããããã®å
±åäœæ¥ã調æŽããããšããŠããå ŽåãRxJSãããã§åœ¹ç«ã¡ãŸãã
- é
åã§å·šå€§ãªããŒã¿ã»ãããåŠçãããã®ããŒã¿ã®ã¹ãããããšã®åŠçãæŽçããå¿
èŠãããå ŽåãRxJSãªãã¬ãŒã¿ãŒã¯ãäžéé
åãäœæããã«ãããã®ããŒã¿ã»ãããåŠçãããšãã«ãã©ã³ã¹ãã¥ãŒãµãŒã®ãããªãã®ãšããŠäœ¿çšã§ããŸãããã®åŸãã¬ããŒãžã³ã¬ã¯ã¿ãŒã䜿çšããŠç Žæ£ããå¿
èŠããããŸãã
Rxãªãã¬ãŒã¿ãŒã®ç 究ã決å®ãããšããã©ãããå§ããŸããïŒ
éå§ããæŒç®åã®ãªã¹ãã«ã¯ã
map
ã
filter
ããã³
scan
å«ããå¿
èŠããã
map
ã ãã®ä»ã®éèŠãªæŒç®åã«ã¯æ¬¡ã®ãã®ããããŸãã
switchMap
concat
share / shareReplay
æŒç®åã®ãªã¹ãããæãé »ç¹ã«å¿
èŠãª10åæªæºã«çµã蟌ãããšãã§ããŸãã ãã¡ããã
pairwise
ã
bufferCount
groupBy
ãªã©ãå®éšã§ããæŒç®åããããŸãã ãããã®äžæè°ãªæŒç®åã¯çç±ããããŸãããããŸãé »ç¹ã«ã¯äœ¿çšãããŸããã ãã ãããããã®æŒç®åã«ãã£ãŠå®è£
ãããã¢ã¯ã·ã§ã³ãå®è¡ããå¿
èŠããããŸããªã±ãŒã¹ã§ã¯ãèªåã§ã¢ã¯ã·ã§ã³ãäœæããæ¹æ³ã«ã€ããŠå°æããå¿
èŠã¯ãããŸããã
Reactã®ãããªãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠRxJSã䜿ãå§ããã®ã¯ç°¡åã§ããïŒ
Reactã§ã®RxJSã®äœ¿çšã¯ãAngularã§ã®äœ¿çšãšéåžžã«ãã䌌ãŠãããå®å
šã«å®è£
ãããŠããŸãã Angularã§ã¯ã芳å¯å¯èœãªãªããžã§ã¯ãã¯ã·ã¹ãã ã®æ¬æ Œçãªãšã³ãã£ãã£ã§ãããããAngularã§ãã®ãã¯ãããžãŒã䜿çšããããšã¯éåžžã«ç°¡åã§ãã ãã ããããã¯
componentDidMoun
tã§RxJSã«ãµãã¹ã¯ã©ã€ãããcomponentWillUnmountã§ãµãã¹ã¯ã©ã€ã解é€ãããããè€éã§ã¯ãããŸããã ãã®ãã¹ãŠã®åºç€ã¯Angularãšåãèãæ¹ã§ãããAngularã§ã¯ãããã®ã¡ã«ããºã ãçµã¿èŸŒãŸããŠããã ãã§ãReactã§ã¯ãã¹ãŠãæåã§å®è£
ããå¿
èŠããããŸãã
Rxã®ãããã°ã«é¢ãããã³ããå
±æã§ããŸããïŒ
ä»ã®ãã¯ãããžãŒãšåæ§ã«ãRxã«ã€ããŠåŠç¿ãããšãçµéšãç©ãã«ã€ããŠãããã°ã容æã«ãªããŸãã ãããã°ãé£ããç¶æ³ãããã€ããããŸãã çŸåšãChromeéçºããŒã ãšååããŠãããã®åé¡ã解決ããŠããŸãã
ããã°ã©ããçŽé¢ããå
žåçãªå°é£ãªç¶æ³ã¯ã
mergeMap
ããäœããè¿ãã
mergeMap
å¯èœãªãªããžã§ã¯ããåãåãããšãæåŸ
ããŠããå Žåã§ãããããã¯ç£èŠå¯èœãªãªããžã§ã¯ãã§ã¯ãªãããšãããããŸãã 次ã«ã芳枬å¯èœãªãªããžã§ã¯ãã§ãããšèãããããã®ãè¿ããé¢æ°ãèŠãæ©äŒãåŸãããšæã£ãŠããŸãããããã§ã¯ãããŸããã ããã瀺ãæ¹æ³ã¯çŸåšãããŸãããäœãè¿ãããããæ£ç¢ºã«ç¥ãããšã¯äžå¯èœãªããã§ãã
ãããã°ã®ãã³ãã次ã«ç€ºããŸãã
console.log()
åŒã³åºããconsole.log()
ããªãã§ãã ããã
- ç£èŠå¯Ÿè±¡ãªããžã§ã¯ãã®ãã§ãŒã³ã«
do
æŒç®åãå«ããŸããããã«ãããããŸããŸãªã¹ãããã§ç£èŠå¯Ÿè±¡ãªããžã§ã¯ãã®ç¶æ
ãšãã®æ»ãå€ã確èªã§ããŸãã
RxJSã®å°æ¥ã«ã€ããŠã©ãæããŸããïŒ
RxJSã§ã¯ã泚æãã䟡å€ã®ããããã€ãã®å€æŽãäºæ³ãããŸãã ãã®ããããããããlettableããªãã¬ãŒã¿ããŸããªãå©çšå¯èœã«ãªããŸãã ãã®æŠå¿µã®ãããã§ãããšãã°ããªããžã§ã¯ãèªäœã«
map
æŒç®åã䜿çšãã代ããã«ãåŒã³åºããããšãã«å¥ã®é¢æ°ãè¿ã
map
é¢æ°ããããŸãã ãã®é¢æ°ã¯ãç£èŠå¯Ÿè±¡ãªããžã§ã¯ãã«ãã£ãŠäœ¿çšãããç¬èªã®æŒç®åã䜿çšããŠå®è¡ãããã®ãšåãã¢ã¯ã·ã§ã³ãå®è¡ããŸãã ããšãã°ã
observable.map.filter.scan
ãã
observable.map.filter.scan
ãã®ãæžã代ããã«ã
observable.compose(map, filter, scan)
æžãããšãã§ããŸãã ä»ã®é¢æ°ãäœæããããã®é¢æ°ãããå Žåãå€ãã®é¢æ°åããã°ã©ãã³ã°ã®å¯èœæ§ãéããããããããã¯éåžžã«æ·±å»ã§æçšãªå€æŽã§ãã ãã®æ¹åã«é¢é£ãããã1ã€ã®æ¹åç¹ã¯ãããã±ãŒãžãæ§ç¯ãããšãã«æªäœ¿çšã®ã³ãŒããåé€ããããšã§ãïŒããªãŒã®æºãïŒã
çŸåšããã®ãããªæé©åã¯RxJSã§ã¯çºçããŸããã ãã¹ãŠããããã¿ã€ãã§ãã ããã«ããããã€ã³ããä»ããŠãªãã¬ãŒã¿ã¬ã³ãŒãã䜿çšã§ããŸãããç¹å®ã®ãããžã§ã¯ãã§å®éã«äœ¿çšãããŠããªããŠãããã¹ãŠã®ãœãŒã¹ã³ãŒãã䜿çšãããŠãããšèŠãªããããããã·ã¹ãã ã¯ããã±ãŒãžã®ãµã€ãºãæé©åã§ããŸããã
RxJSã®äººæ°ã®é«ãŸãã¯ãReactãšAngularã«ã©ã®ããã«åœ±é¿ããŸããïŒ
RxJSãããã¢ã¯ã»ã¹ãããããªããããŸããŸãªãããžã§ã¯ããžã®çµ±åã容æã«ãªã£ãŠãããããããã³ããšã³ãéçºè
ã®éã§ããåºãæ®åããããšãé¡ã£ãŠããŸãã çŸåšãRxJSã®åºç¯ãªæ¡çšã«ã¯2ã€ã®é害ããããŸãã 1ã€ç®ã¯åŠç¿ã®é£ããã§ãã 2çªç®ã¯ã©ã€ãã©ãªã®ãµã€ãºã§ãã RxJSã¯é·ãéååšããŠããŸããããã¡ã€ã³ã®éçºããŒã ãç»å Žããåã¯ããããããã°ã©ãã«ç°¡åã§ããããããæ¹æ³ã§æ瀺ããæ¹æ³ãç解ããããšã¯å°é£ã§ããã
Rxã®äœæè
ã¯çŽ æŽããã人ã
ã§ããã圌ãã¯è€éãªçšèªã䜿çšããŠãããããéçºè
ã®ã³ââãã¥ããã£ããã®ãããžã§ã¯ããžã®æ³šæãæ¬ ããŠããŸãã ãã ããThis Dotã®ãããªæè²ãªãœãŒã¹ã®ãããã§ããã®ãã°ãããããŒã«ãžã®é¢å¿ãé«ãŸã£ãŠããŸãã
RxJSã®ãããªãé
åžãä¿é²ããããã«ãç§ã¯çŸåšãã©ã€ãã©ãªã®ãµã€ãºãçž®å°ããããšã«åãçµãã§ããŸãã Tiny RxããŸãã¯T-Rxãã楜ãã¿ã«ã äžèšã§èšãã°ããã®ãããžã§ã¯ãã§ã¯24ãããã€ãïŒå§çž®g-zipïŒã©ã€ãã©ãªãããã3 Kbã«æžããããšãã§ããŸããïŒ
RxJSã®äººæ°ãã©ã®ããã«é«ãŸã£ãŠããã®ããããå€ãã®ããã°ã©ããŒãRxJSã䜿çšããŠããã®ãèŠãŠããããã§ãã ããã«ã誰ããRxJSã«åå ããŠããã®åŒ·åã§äŸ¿å©ãªããŒã«ã®éçºã«å®çŸå¯èœãªè²¢ç®ãããããšãã§ãããšèšããªããã°ãªããŸããã
RxJSã®æ©èœã«å°ã粟éããŠããŠãããã«åŠç¿ãããå Žåã¯ã
Rx Workshop ã
Intro to Rx ã
Thinking Reactivelyãããã³
RxJS in Depthãåç
§ããŠãã ãã ã
芪æãªãèªè
ïŒ ãããžã§ã¯ãã§RxJSã䜿çšããŠããŸããïŒ