如何确保在使用Saga触发某些操作后执行所有操作?

时间:2017-12-18 18:11:13

标签: javascript redux redux-saga

我有一些在应用程序启动时从服务器加载的初始数据。

加载然后触发InitialDataLoaded之类的动作。

此数据将保存到某个州,并用于将来与服务器的所有通信。

当应用加载该数据时,takeEvery(action)可以发送其他一些请求。如果暂时没有初始数据,我无法发送这些请求,因为它们没有初始数据就没有意义。

如何确保所有相关操作仅在触发所需操作时才会引发请求?

1 个答案:

答案 0 :(得分:1)

我不确定是否可以发送给takeEvery的其他请求是由UI启动的(在这种情况下,如果加载了初始数据,你可以通过检查一些prop来禁用UI)。

但是如果你在saga中讨论,你可以等待这样的InitialDataLoaded动作:

function* watchAppInit() {
  while (true) {
    // when this completes it dispatches the InitialDataLoaded action
    yield fork(loadInitialData); 

    yield take(actionTypes.InitialDataLoaded);

    // this won't execute until InitialDataLoaded action is dispatched
    yield fork(doOtherStuff);
  }
}

或者您可以检查其他操作中的状态:

function* watchDoOtherStuff() {
  while (true) {
    const action = yield take(actionTypes.DO_OTHER_STUFF);

    // check the state to see if you have initial data
    const initialized = yield select(selectors.getInitialDataLoaded);

    if (initialized) {
      yield fork(doIt);
    }
  }
}