我有一个史诗
- 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找到了类似的问题 但这并不是我真正想要的。
答案 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