有条件地调度 side-effects

Conditionally dispatching side-effects

假设我有一个搜索组件,它根据用户选择的标签进行搜索(想想 Pocket)。如果用户取消选择所有标签,我知道搜索结果将为空;无需点击服务器。我如何重构这部史诗以有条件地 运行 side-effect?

const removeTagEpic = (action$: any, store: any) => 
  action$
    .ofType(types.REMOVE_SELECTED_TAG)
    .map((action: any) => action.payload)
    .mergeMap((tag: any) => {
      //only do this is store.getState().tags > 0
      ajax.getJSON(`https://api.github.com/users/dwaynelavon`)
        .flatMap(response => 
          Observable.concat(
            Observable.of(actions.fetchingProfiles(true)),
            Observable.of(actions.fetchProfilesFulfilled(profiles)),
            Observable.of(actions.fetchingProfiles(false))
          )
        )
    })

您不能使用 filter 运算符并检查其中的标签吗?

const removeTagEpic = (action$: any, store: any) => 
  action$
    .ofType(types.REMOVE_SELECTED_TAG)
    .filter(_ => store.getState().tags > 0)
    .map((action: any) => action.payload)
    .mergeMap((tag: any) => {
      ajax.getJSON(`https://api.github.com/users/dwaynelavon`)
        .flatMap(response => 
          Observable.concat(
            Observable.of(actions.fetchingProfiles(true)),
            Observable.of(actions.fetchProfilesFulfilled(profiles)),
            Observable.of(actions.fetchingProfiles(false))
          )
        )
    })

如果不满足条件,types.REMOVE_SELECTED_TAG的来源将不会被发射。

https://www.learnrxjs.io/operators/filtering/filter.html