对于redux-saga中 actionChannel 缓存器的个人理解

对于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版权协议,转载请附上原文出处链接和本声明。