如何确保数据在 Redux Saga 中不被加载两次?

How to ensure data is not loaded twice in Redux Saga?

比方说,我有一个带有 ReduxRedux-Saga 的简单 React 应用程序。我想加载一些数据,但要确保数据不会加载两次。将多次请求数据。

我天真的实现如下:

function* loadMyData() {
    const isMyDataLoaded = yield select(isMyDataLoadedSelector);
    if (!isMyDataLoaded) {
        yield call(loadMyData);
    }
}

有更好的方法吗?

有很多方法可以实现这一点,包括您提到的方法 - 我觉得很好。

另一种方法是只等待一次加载操作:

function * loadMyDataSaga() {
   yield call(loadMyData);
}

function * watcher() {
    yield take(ACTIONS.LOAD_DATA);
    yield fork(loadMyDataSaga);
}

take 效果 - 与 takeEvery 不同 - 只会等待 LOAD_DATA 动作一次。 LOAD_DATA 的任何后续调度都将被忽略。

除了 redux/redux-saga 层之外,您还可以在 loadMyData 之上实现某种记忆缓存。如果您从 sagas 以外的其他地方加载数据,这将很有用。