如何解决在使用 redux-observables 开始另一个史诗之前,如何等待不同的史诗完成并更新商店?
在我的场景中,当应用加载时,我会调度一个动作来启动史诗以创建 API 实例,这是进行其他 API 调用所必需的:
const connectApiEpic: Epic = (action$,state$) =>
action$.pipe(
ofType('CONNECT_API'),mergeMap(async (action) => {
const sdk = await AppApi.connect({ url: apiUrl });
return { type: 'SET_API',payload: api };
})
);
UI 已经加载,API 连接发生在后台。现在,如果用户点击某个搜索按钮,我必须调度另一个动作(epic)来执行搜索,这需要 API 已经连接。
基本上,我需要执行以下操作:
const searchItem: Epic = (action$,rootState$) =>
action$.pipe(
ofType('SEARCH_ITEM'),mergeMap(async (action) => {
const { api } = rootState$.value;
const item = await api.search(action.item);
return { type: 'SET_ITEM',payload: item };
})
);
但是,在 connectApiEpic
的商店中设置 API 之前,这将不起作用。
使用 redux-observables 和 rxjs,怎么可能:
- 应用启动时在后台连接api(已解决)
- 如果用户点击“搜索”,则调度一个史诗进行搜索,但先等待api连接,或如果api已经连接,然后继续执行搜索
解决方法
因此,如果 api
是您在 searchItem
史诗中需要等待的,我认为这将是一种方法:
const searchItem: Epic = (action$,rootState$) =>
action$.pipe(
ofType('SEARCH_ITEM'),mergeMap(
// waiting for the api to connect first
// if it's already there,everything will happen immediately
action => rootState$.pipe(
map(state => state.api)
filter(api => !!api),),mergeMap(
api => from(api.search(action.item)).pipe(
map(item => ({ type: 'SET_ITEM',payload: item }))
)
)
);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。