使用Redux强制执行要在另一个之前调用的操作

时间:2016-04-01 12:31:43

标签: javascript reactjs redux react-redux

最近我为一个应用程序做了这个,我想知道这是否会被视为不良做法或者是否可以。假设我有一个减速器正在聆听两个动作:

switch (action.type) {
  case 'PRE_FETCH_ACTION':
    return Object.assign({}, state, {value: action.value, isAllowed: true})
  case 'FETCHED_SUCCESS':
    if (!state.isAllowed) {
      throw Error('You did not dispatch PRE_FETCH_ACTION before fetching!');
    }
    return Object.assign({}, state, {data: action.data, isAllowed: false})
}

所以流程是:

  • 我发送PRE_FETCH_ACTION
  • 我对外部API进行了一次提取调用
  • 当服务响应返回时,它将发送FETCHED_SUCCESS

如果某人尝试在不先发送PRE_FETCH_ACTION的情况下获取数据,则代码会抛出错误。

好的,所以这很好用。正如我所说,我担心的是,这是否会被认为是一种糟糕的模式。我为什么这么认为?因为isAllowed状态对reducer来说是内部的,它不会影响任何组件渲染方法。

1 个答案:

答案 0 :(得分:1)

我认为你的应用程序状态中有这样的“技术”标志是可以的。

在您的情况下,您希望确保按特定顺序分派操作,这定义了应用程序的特定行为(例如,在启动数据获取时在屏幕上显示加载程序)。这就是为什么我认为你的“技术”旗帜最终会管理你的用户界面。

为了让您的减速机“仅减少”,您可以在调度之前通过测试您的行动创建者状态来进行检查。 Redux关于async actions的文档详细介绍了这种模式。您可以在“thunk”动作创建器中执行此操作,而不是调用同步操作“fetchedSuccess”,如下所示:

function toFetchedSuccess(data) {  // "thunk" action creator
    return (dispatch, getState) => {
        const state = getState();  // current state
        if(!state.isAllowed) {
            console.error(
                'You did not dispatch PRE_FETCH_ACTION before fetching!');
            return Promise.resolve();  // nothing to do
        } else {
            return dispatch(fetchedSuccess(data));
        }
    };
}