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

时间:2017-06-07 03:44:51

标签: javascript redux-saga

Redux saga noob在这里。

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

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

我需要并行发出这些ajax请求并等待GET_CURRENT_USER_SUCCESSGET_GROUPS_SUCCESS操作,然后发出pageReady操作,告诉用户界面是时候渲染反应成分。

我想出了一个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传奇等待GET_GROUPS_SUCCESSGET_CURRENT_USER_SUCCESS以任意顺序至少发生一次

1 个答案:

答案 0 :(得分:10)

我想你想要all effect

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

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

  yield put(actions.pageReady())
}