Redux-Ngrx动作分派异步处理

时间:2019-08-23 09:10:06

标签: javascript redux rxjs observable ngrx

我有一个时间滑块,可以触发操作以过滤每次更改的数据

this.selectedDate$
  .pipe(
    switchMap(elm => {
      this.selectedTime = elm.timeSelect;
      this.store.dispatch(new GetSchedulesByTime(elm.timeSelect.toString()));
      return this.store.pipe(select(selectSchedulings));
    })
  )
  .subscribe((schedules: ISchedule[]) => {
...});

GetSchedulesByTime用新数据更新商店;

selectSchedulings是此新数据的选择器

发生的事情是,当selectedDate的动作被调度时,选择器仍然指向最后一个状态,因此我的处理方式失真了。

这是我的动作代码

case ESchedulesActions.GetSchedulesByTime: {
  let time = action.payload;
  return { ...state, actualTrips: [...(state.schedulings[time] || [])] };
}

和选择器

export const selectSchedulings = createSelector(
  schedulings,
  (state: ISchedulesState) => state.actualTrips
);

如何确保选择器在返回新状态之前指向新状态?

1 个答案:

答案 0 :(得分:1)

对分发和选择的实际工作方式有一些了解。

发送 当您分派动作时,它会要求一个效果(如果存在)。效果或动作有效负载的输出直接传输到简化状态的缩减程序。

选择 选择器可帮助您选择状态的特定部分。 this.store.select基本上会为您返回可订阅的观察对象。此订阅意味着状态发生任何变化时,都会调用您的订阅回调。

因此,您基本上需要做的是取出选择器并订阅它,如下所示:

this.scheduling$ = this.store.select(scheduleSelectors.selectSchedulings);
this.scheduling$.subscribe((data)->{
//do something with the data
//This is called everything state changes
})

因此,您不需要每次都通过管道传递选择器。只需订阅一次就足够了。在每次执行操作时,您的状态都应更改,这将依次调用上述订阅。为了验证这一事实,您可以调试代码并自行检查。