我怎样才能让 redux-saga 以任何顺序等待两个动作至少发生一次?

How can I get redux-saga to wait for two actions to happen at least once in any order?

这里是 Redux 传奇新手。

我需要创建一个传奇,从我的 API 服务器加载 redux 存储的初始状态。

这涉及使用两个异步传奇:getCurrentUsergetGroups

我需要并行发出这些 ajax 请求并等待 GET_CURRENT_USER_SUCCESSGET_GROUPS_SUCCESS 动作,然后再发出 pageReady 动作告诉 UI 是时候渲染反应组件了。

我想到了一个 hacky 解决方案:

function * loadInitialState () {
  yield fork(getCurrentUser)
  yield fork(getGroups)

  while (true) {
    yield take([
      actions.GET_GROUPS_SUCCESS,
      actions.GET_CURRENT_USER_SUCCESS
    ])
    yield take([
      actions.GET_GROUPS_SUCCESS,
      actions.GET_CURRENT_USER_SUCCESS
    ])
    yield put(actions.pageReady())
  }
}

此代码的问题在于,如果由于某种原因 GET_GROUPS_SUCCESS 发出两次,pageReady 操作将提前调用。

如何让 redux saga 等待 GET_GROUPS_SUCCESSGET_CURRENT_USER_SUCCESS 发生 至少一次以任何顺序

我想你想要 all effect

function * loadInitialState () {
  // start loading state...

  yield all([
    take(actions.GET_GROUPS_SUCCESS)
    take(actions.GET_CURRENT_USER_SUCCESS)
  ]);

  yield put(actions.pageReady())
}