rxjs - 对异步 redux-observable 操作进行排序
问题描述
我想对多个异步操作进行排序,当它们全部完成时,发出最终操作:
const initializeEpic = (action$, state$, dependencies) =>
action$.ofType("INITIALIZE_APP_REQUEST").pipe(
mergeMap((action) =>
[
getUserRequest(),
getCoreDataRequest(),
// many other requests ...
// now here I want to subscribe to GET_USER_SUCCESS,
// GET_CORE_DATA_SUCCESS and other request "success" type's and
// once all are called, call initializeApp.success()
// keep in mind that "..._SUCCESS" actions are called from
// corresponding getUserEpic, getCoreDataEpic, etc...
]
)
)
我不确定我是否正在尝试用好的方法来实现史诗般的构图,但简而言之,我的想法是:
PARENT_REQUEST
用动作调用父史诗- 通过相应的动作调用子史诗
*_CHILD_REQUEST
(子史诗将通过 捕获它action$.ofType(*_CHILD_REQUEST)
) - 订阅
*_CHILD_SUCCESS
父史诗中的动作(从子史诗派发) - 调用所有
*_CHILD_SUCCESS
操作后,调用PARENT_SUCCESS
解决方案
相信你正在寻找forkJoin
。你可以这样做:
const loadEpic = (action$, state$) =>
action$.ofType("INITIALIZE_APP_REQUEST").pipe(
mergeMap((action) =>
forkJoin([
getUserRequest(),
getCoreDataRequest()
]).pipe(
map(([users, coreData]) =>
initializeApp.success(users, coreData)
)
)
)
)
请注意,请求是同时完成的,而不是顺序完成的。只要它们不相互依赖,您就不必按顺序制作。
此外,getUserRequest()
并且getCoreDataRequest()
必须返回一个可观察的,例如:
function getUserRequest() {
return from(axios.get(`/endpoint`)).pipe(map(response => response.data));
}
推荐阅读
- junit - 调用 mockito 模拟函数时出现 NullPointerException
- javascript - 无法运行基本反应
- ios - 每行包含项目的水平列表
- if-statement - 如果在水晶报表中的布尔列上使用其他公式
- c# - 序列化并将多个项目添加到json
- javascript - 将数组添加到数组数组
- java - 如何在 IntelliJ 中调试子进程?
- ios - 如何在子视图内动态约束单元格内容视图?
- r - 如何在 SparkR 脚本中找到导致错误的行?
- java - CriteriaBuilder.createQuery 和 EntityManager.createQuery 有什么区别?