forkEpic,redux-observable 1.0.0-alpha.2,typescript

时间:2018-05-21 12:36:12

标签: rxjs redux-observable rxjs6

我有一个史诗

  - run:
          name: Flake8 Check
          command: |
            . venv/bin/activate
            pytest --flake8

当我在任何地方调用actions.getRailways.request()时,它按预期工作(首先是REQUEST动作,接下来是FAULURE的成功)

我有另一部史诗

type GetRailwaysEpic = Epic<GetRailwaysActions, AppState>;

const getRailwaysEpic: GetRailwaysEpic = (action$, state$) =>
  action$.pipe(
    filter(isActionOf(getRailways.request)),
    switchMap(a =>
      getRailways(state$.value.mileages.filters.date)
        .then(getRailways.success)
        .catch(getRailways.failure)
    )
  );

我的ForkEpic功能:

const initEpic: Epic<FiltersActions, AppState> = (action$, state$) =>
  action$.pipe(
    filter(isActionOf(init)),
    switchMap(({ payload: { date, depotId, locTypeId, railwayId } }) =>
      of(selectDate(date)).pipe(
        concat(
          forkEpic(getRailwaysEpic, state$, getRailways.request())
        )
      )
    )
  );

我想要的是什么:&#39; init&#39;行动 - &gt; &#39; selectDate&#39;行动 - &gt; &#39; getRailways.request&#39;行动 - &gt; &#39; getRailways.success&#39; | &#39; getRailways.failure&#39;动作

我所看到的:&#39; init&#39;行动 - &gt; &#39; selectDate&#39;行动 - &gt; &#39; getRailways.success&#39; | &#39; getRailways.failure&#39;动作

&#39; getRailways.request&#39;行动在某个地方失踪了。 我做错了什么?

P.S。 getRailways - 是一个返回promise的函数 P.P.S.我在How to chain async actions and wait for the result without store.dispatch找到了类似的问题 但这并不是我真正想要的。

1 个答案:

答案 0 :(得分:0)

所以问题是forkEpic函数在本地调用getRailwaysEpic因为它正在使用switchMap它正在吞噬“请求”操作,从而阻止它到达epicMiddleware。 / p>

最好的解决方案是使用“请求”操作流连接“选择”操作并将其返回,以便epicMiddleware将其正确传播回商店,然后它将被getRailwaysEpic拦截并由操作处理$ stream。

以下是code-sandbox中的工作解决方案: https://codesandbox.io/s/375z2qwv1

这是负责任的代码:

const requestEpic = action$ =>
  action$.pipe(
    filter(a => a.type === 'request'),
    switchMap(a => from(makeRequest()).pipe(map(success)))
  );

const initEpic = action$ =>
  action$.pipe(
    filter(a => a.type === 'init'),
    concatMap(a => of(select(), request()))
  );

const rootEpic = combineEpics(requestEpic, initEpic);
const epicMiddleware = createEpicMiddleware(rootEpic);

// 1
// store.dispatch(init());
// should be:
// init -> select -> request -> success

// 2
// store.dispatch(request());
// should be:
// request -> success