如何在Reduce-saga中对请求进行分组

如何在Reduce-saga中对请求进行分组

问题描述:

我需要为多个图表加载数据。我还希望仅当图表设置更改(distinctUntilChanged)并删除较旧的请求(不再反映当前设置 - 这就是switchMap所做的操作)时才发送请求。在rxjsredux-observable,它应该是这样的:如何在Reduce-saga中对请求进行分组

export const chartsEpic = action$ => 
    action$ 
    .ofType('CHART_DATA_REQUESTED') 
    // group actions by chart id... 
    .groupBy(action => action.meta.chartId) 
    // ...and for each chart: 
    .map(actionsByChart$ => 
     actionsByChart$ 
     // continue only if settings change 
     .distinctUntilChanged((a1, a2) => compare(a1.payload.settings, a2.payload.settings)) 
     // load data, but drop old requests when we get new settings 
     .switchMap(action => 
      Observable.fromPromise(fetchChartData(action.payload.settings)) 
      .map(data => ({type: 'CHART_DATA.SUCCESS', payload: data, meta: action.meta)) 
      .catch(error => Observable.of({type: 'CHART_DATA.FAILURE', payload: error, meta: action.meta})) 
     ) 
    ) 
    // combine actions for all charts into one output stream 
    .mergeAll(); 

什么是redux-saga可比的代码?

通用的方式来实现这一目标:

function* syncChartsFlow(){ 
    var fetchTask = null; 
    while(true){ 
      yield take([INITIAL_FETCH, SETTINGS_CHANGED]) 
      if(fetchTask){ 
       yield cancel(fetchTask) 
      } 
      fetchTask = yield fork(fetchChartsInfo) 
    } 
} 

function* fetchChartsInfo(){ 
    // fetch info here 
} 
+0

但是,这仅仅是一个图表,正确吗?它不处理chart_中的请求分组。 – dkl