Javascript 还原剂中的反应/重排、连锁或承诺

Javascript 还原剂中的反应/重排、连锁或承诺,javascript,reactjs,redux,Javascript,Reactjs,Redux,我有一个react/redux应用程序,其中我有一些过滤和搜索功能。由于API是如何设置的,我必须在接收过滤器和发送新的搜索查询之间做一些基础工作。所以我有一个活动过滤器的小参考图,每次我选中或取消选中过滤器时都会更新。问题是,我希望运行更新过滤器的操作,然后使用新的过滤器参数调用服务器,我不确定该工作流在redux中应该如何运行 所以我调用这个动作,然后它以更新的状态点击减速器,就像这样- case actions.TOGGLE_FILTER: return togg

我有一个react/redux应用程序,其中我有一些过滤和搜索功能。由于API是如何设置的,我必须在接收过滤器和发送新的搜索查询之间做一些基础工作。所以我有一个活动过滤器的小参考图,每次我选中或取消选中过滤器时都会更新。问题是,我希望运行更新过滤器的操作,然后使用新的过滤器参数调用服务器,我不确定该工作流在redux中应该如何运行

所以我调用这个动作,然后它以更新的状态点击减速器,就像这样-

 case actions.TOGGLE_FILTER:
            return toggleFilter(state, action);


var toggleFilter = function(state, action){
var currentFilters = state.toJS().activeFilters || {};
var removeFilterFromActive = function(item) {
    if(item != action.filter.search){
        return;
    }
}
//already exists, remove from list (toggle off)
if (currentFilters[action.filterGroup.parentSearch] && currentFilters[action.filterGroup.parentSearch].indexOf(action.filter.search) > -1) {
    var itemIndex = currentFilters[action.filterGroup.parentSearch].indexOf(action.filter.search);
    currentFilters[action.filterGroup.parentSearch].splice(itemIndex, 1);
} else {
    //add to obj
    var newObj = {};
    if (currentFilters[action.filterGroup.parentSearch]) {
        currentFilters[action.filterGroup.parentSearch].push(action.filter.search);
    } else {
        newObj[action.filterGroup.parentSearch] = [];
        newObj[action.filterGroup.parentSearch].push(action.filter.search);
        _.extend(currentFilters, newObj);
    }
}
return state.set('activeFilters', fromJS(currentFilters));
};
因此,这组装了我的
activeFilters
state,目前似乎工作正常。但我不明白的是,如何使用更新的activeFilters调用服务器。现在我只是从正在使用的组件调用此操作


有没有一种方法可以在减速机内连锁、承诺或分派另一个操作(当此操作完成时)?任何关于如何处理这一问题的建议都将不胜感激。谢谢

reducer应该是纯的,没有副作用,因此您不希望reducer向服务器发出请求或发出额外的操作

如果正在使用,则可以将函数作为操作分派。这些函数可以检查存储的状态。这些函数可以自动分派多个常规操作。而且,如果您没有对Redux更新进行任何批处理,他们可以在发送操作后检查存储,然后执行更多操作

考虑到上述情况,您可以这样做:

function createToggleFilterAndQueryServerAction(filterGroup, filter) {
    return (dispatch, getState) => {
        // first dispatch the filter toggle
        // if you do not have any batching middleware, this
        // should run the reducers and update the store
        // synchronously
        dispatch(createToggleFilter(filterGroup, filter));

        // Now get the updated filter from the store
        const activeFilter = getState().activeFilter;

        // now query the server
        callServer(activeFilter).then(result => {
            // Now dispatch an action with the result from the server
            dispatch(createServerResponseAction(result));
        });
    };
}
用法:

dispatch(createToggleFilterAndQueryServerAction(..., ...));

服务器调用都是在中间件中为我设置的-它检查每个操作的特定值并截取。那么,对于这里的查询部分,我可以调度第二个操作吗?谢谢当然只需使用更新的过滤器发送动作谢谢你的回答,这对我来说还是新鲜事,有点让人不知所措。最后一个问题-我的状态是使用immutablejs,我注意到您正在传递getState,这是否仍然适用于immutable?
getState
将为您提供redux存储的内容。因此,如果将不可变对象放入存储,则
getState()
将返回这些不可变对象。