Redux Saga-将类似(但不是全部)的动作分组为takeLeading / takeLatest

时间:2018-11-20 12:29:32

标签: reactjs redux redux-saga

我目前在一个项目上使用redux-saga,并且我想使用它来防止多次请求相同的资源。

此刻,我在同一页面上有多个组件在请求资源(即调度{types: "REQUEST_POST_COMMENTS", postId: <postIdHere>}

我有这个传奇:

export function* loadPostComments() { yield takeLatest("REQUEST_POST_COMMENTS", loadPostComments); }

我的页面同时调度以下操作:

  • {types: "REQUEST_POST_COMMENTS", postId: 123}
  • {types: "REQUEST_POST_COMMENTS", postId: 321}
  • {types: "REQUEST_POST_COMMENTS", postId: 123}

我的目标是让loadPostComments被调用两次,一次被称为123,而一次被称为321。

在测试版中,我已切换到takeLeading-但这只会调用一次loadPostComments

除了通过takeLatest值将action.type分组的模式以外,是否可以使用模式定义传奇?还是通过任何类似的方式实现?

1 个答案:

答案 0 :(得分:0)

我的解决方案

您必须将遇到的postId和以下内容保存到它们:

function* watchRequestPostComments() {
  const encounteredPostIds = new Set()

  while(true) {
    const { postId } = yield take('REQUEST_POST_COMMENTS')
    if (!encounteredPostIds.has(postId) {
      yield fork(loadPostComments, postId)
    }
    encounteredPostIds.add(postId)
  }
}

说明

似乎没有特定的redux-saga-esque方式来执行此操作。无论如何,您都必须跟踪这些ID。

我已经回答了有关throttling requests的类似问题。

附言::这看起来像是无休止的递归。必须是无意的名称冲突:

export function* loadPostComments() {
  yield takeLatest("REQUEST_POST_COMMENTS", loadPostComments)
}