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