javascript - 触发多个操作并等待它们解析 RxJS / Redux Observables
问题描述
我有一个动作要用来初始化我的应用程序,我想为这个动作创建一个史诗,然后在这个动作的后面触发多个其他动作,等待它们全部完成,然后再触发另一个动作。我看了其他问题,它与这个非常相似
我已经尝试过这种方法,但对我来说,它不起作用,它会触发该APP_INIT
动作,但随后无法触发序列中的任何其他动作。有人能帮忙吗?
import { of } from 'rxjs';
import { mergeMap, zip, concat, mapTo } from 'rxjs/operators';
import { ofType } from 'redux-observable';
import { firstAction, secondAction } from 'actions';
export default function appInit (action$) {
return (
action$.pipe(
ofType('APP_INIT'),
mergeMap(() =>
concat(
of(firstAction()),
of(secondAction()),
zip(
action$.ofType('ACTION_ONE_COMPLETE'),
action$.ofType('ACTION_TWO_COMPLETE')
).mapTo(() => console.log('complete'))
)
)
)
);
}
解决方案
原来我的代码在第一个实例中几乎没问题,主要原因是我是从我应该直接导入concat
的时候导入的,我花了几个小时才意识到,但现在它可以工作了。rxjs/operators
rxjs
下面的完整代码适用于任何可能有帮助的人。
import { of, concat, zip } from 'rxjs';
import { mergeMap, map, take } from 'rxjs/operators';
import { ofType } from 'redux-observable';
import { appInitialisationComplete, APP_INITIALISATION } from 'client/actions/app/app';
import { actionOne, ACTION_ONE_COMPLETE } from 'client/actions/action-one/action-one';
import { actioTwo, ACTION_TWO_COMPLETE } from 'client/actions/action-two/action-two';
/**
* appInitialisationEpic
* @param {Object} action$
* @return {Object}
*/
export default function appInitialisationEpic (action$) {
return (
action$.pipe(
ofType(APP_INITIALISATION),
mergeMap(() =>
concat(
of(actionOne()),
of(actioTwo()),
zip(
action$.ofType(ACTION_ONE_COMPLETE).pipe(take(1)),
action$.ofType(ACTION_TWO_COMPLETE).pipe(take(1))
)
.pipe(map(() => appInitialisationComplete()))
)
)
)
);
}
推荐阅读
- angular - 如何编写一个发出http请求并返回请求结果的函数?
- postgresql - 使用 COPY 将表填充到扩展中?
- python - 使用 Selenium (Python) 单击项目
- flutter - Flutter/Dart json 用特殊字符编码密码
- python - 如何使用烧瓶添加路由/视图功能?
- java - 带有类对象的哈希图
- php - 如何正确计算 php 日期时间的剩余时间
- python - OBS Studio python 热键
- react-native - React Native TextInput 在 android 上显示未定义
- sql - 是否可以为基于字符串/uuid 的主键创建索引,以便能够通过相似性快速搜索(例如嘈杂的 uuid)?