对于redux-saga中 actionChannel 缓存器的个人理解
官方对于actionChannel 的解释和例子都比较奇怪,很容易让人误以为actionChannel 的作用是阻塞流程,让action可以一个一个的处理。其实并不是这样理解的。
actionChannel
actionChannel 的作用更像是为了防止在阻塞过程中导致中间的的action被忽略,所以要创建一个缓存器,先暂时缓存下来
//这里借用官方的例子
import { take, actionChannel, call, ... } from 'redux-saga/effects'
function* watchRequests() {
// 1- 为 REQUEST actions 创建一个 channel
const requestChan = yield actionChannel('REQUEST')
while (true) {
// 2- take from the channel
const {payload} = yield take(requestChan)
// 3- 注意这里我们用了一个阻塞调用
yield call(handleRequest, payload)
}
}
function* handleRequest(payload) { ... }
这里call是一个阻塞调用循环会在这里先停下来,如果没有requestChan作为缓存器,在call的异步操作还没结束之前所有的action请求都会被忽略,而有了这个缓存器就可以不断接收action缓存起来不会忽略掉任何一个,这里的缓存器是没有设置大小的,所以默认是无限存储,如果你想设置最大可以缓存几个,使用buffer设置缓存器大小
import { buffers } from 'redux-saga'
import { actionChannel } from 'redux-saga/effects'
function* watchRequests() {
const requestChan = yield actionChannel('REQUEST', buffers.sliding(5))
...
}
版权声明:本文为deng1456694385原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。