LoginSignup
10
10

More than 5 years have passed since last update.

【RxJS】redux-observable入門

Last updated at Posted at 2018-10-01

今まで、React Nativeでredux-sagaを使ったことはあるのですが、それ以外の非同期通信のライブラリについて知見がありませんでしたので、少しまとめます。
ざっくり

  • redux-saga
  • redux-thunk
  • redux-observable

がメジャーどころであるのですが、今回はredux-observableです。

redux-observableとはなんだ

image.png

公式いわく

RxJS 6-based middleware for Redux.

RxJSってなんだ

そもそもRxJSを知りませんでしたので、調べてみます。

とりあえず簡単なサンプルから。


トリプルクリックでランダムな値

// ボタンクリックでランダムな値を生成
const output = document.querySelector("output");
const button = document.querySelector("button");

Observable.fromEvent(button, "click")
  .bufferCount(3) // <--- 3回イベントをバッファ
  .subscribe(() => {
    output.textContent = Math.random()
      .toString(36)
      .slice(2);
  });

2018-09-28_buffercount

ここで登場したもの

bufferCount

countだけバッファする

Subscribe

Observerがデータを購読する。
bufferCount.subscribeの場合、bufferCountのバッファをObserver(観測者)がsubscribeで取得する。

RxJS(ReactiveX)における非同期イベント管理の基本概念

いきなりObserverやらsubscribeやら、見知らぬ単語が出てきました。

Observable

呼び出し可能なevent handler?

Observer

Observableからcallbackして値を取得する(観測者)

Subscription

Observableの実行。実行のキャンセルで便利とのこと

Operators

関数型プログラミングの純粋関数

Subject

値やイベントを複数のObserverにマルチキャストする

Schedulers

dispatcherのキャンセルなどをスケジュールコントロールできる

ReactiveX とは

ReactiveX
JSに限らず、いろんな言語に移植されている。
概念やインタフェース等は各言語の移植後でも共通しているようである。

400ms以内にトリプルクリックしたときにランダム値

そしてもう一度サンプルへ

// 400ms以内にトリプルクリックしたときにランダム値生成
const output2 = document.querySelector("output2");
const button2 = document.getElementById("btn2");
const click$ = Observable.fromEvent(button2, "click");

Observable.fromEvent(button2, "click")
  .bufferWhen(() => click$.delay(400)) // <--------- 400ms待つ
  .filter(events => events.length >= 3) // <--------- events3回
  .subscribe(() => {
    output2.textContent = Math.random()
      .toString(36)
      .slice(2);
  });

2018-09-28_bufferwhen.gif

シリアル通信に似ている気がする

共感してくれる人がいるはず

image

似てるなあ、と思ってからRxの概念がすっと腹落ちした。

image

Action in, Action Outの概念

storeとactionの間にEpicという形で挟まることで、Rxの概念をAction(Redux)にもたらす。

  • Actionを溜めて、一気に実行する。
  • dispatch後のバッファ中のactionはキャンセルすることもできる

などなどの作用がある

image

他ライブラリとの違い

  • redux-thunk:
    • シンプル、その分複雑な処理は苦手(?)
    • dispatch済みアクションのキャンセルが不可
  • redux-Observable:
    • アクションをポーリングで実行したりできる
    • dispatch済みアクションのキャンセルが可能
  • redux-saga:
    • generator関数による実装のため非同期処理の中で同期的に実装
    • dispatch済みアクションのキャンセルが不可

と、言われている

所感

・まだまだRxJSの理解が必要そう。若干のハードル?
 => ただし、JS以外にも言語横断的にReactiveXの概念は使える  
  => 大きな学習コストではない?

・ReactiveXの概念がシリアル通信に似てた

・sagaとobservableは比較されがちだが使用感は異なる??

10
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10