2
2

More than 3 years have passed since last update.

Redux-saga のドキュメントにはない概念: multicast

Last updated at Posted at 2019-10-19

Redux Saga のドキュメントを読んでいたけれども、 Channel 周りの記述で、どうも説明(ドキュメント)が足りないと思うことがあったので、その備忘録。

疑問

Redux Saga のドキュメントには、上記の通り channel の使い方が書いてある。ここで説明されている channel は、どちらかというと queue のような振る舞いをする。

一方で、例えば runSaga のドキュメント をみていると、 redux-saga 自体は、 redux store 以外にも接続しながら実行することができ、その input を司るのが channel パラメータであり、 output を司るのが dispatch のパラメータであることがみて取れる。

しかし、これはドキュメントだけを読んだ際の知識とは矛盾する。何かと言うと、 redux-saga において take を行う場合、それを行なっているすべての saga (rootSaga に合成されているすべての saga) は、単一の dispatch に対して、それぞれが結果の action を取得できる、という前提で進む。 channel が queue であった場合、これは何かがおかしい、という話になる。

回答

redux saga の channel には、普通の queue っぽい channel と、 subscribe / multi dispatch のような振る舞いをする channel がある。その実、ドキュメントの中で存在が言及されている stdChannel は、後者にあたる。

redux-saga をミドルウェアとして redux に接続した場合、 redux store から dispatch された action は、その実、 stdChannel に投入され、それに対してそれぞれの saga は take することになる。

ソースコード上は、 redux-saga の channel は multicast の概念を持っていて、それはソースコード上から確認できる https://github.com/redux-saga/redux-saga/blob/master/packages/core/src/internal/channel.js

2
2
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
2
2