我有一个场景两个动作:
INITIATE
触发上的按钮点击,并且当FETCH_SUCCESS
数据已被存储在状态从称为上页面加载AJAX请求触发。
史诗处理INITIATE
操作需要从FETCH_SUCCESS
是可用的状态下工作数据。
我怎么可以这样写史诗,使其1)请其作为正常的逻辑,因为很多次,因为它是被点击后FETCH_SUCCESS
已经跑了一次,2)如果FETCH_SUCCESS
前点击,等待FETCH_SUCCESS
出现,然后继续逻辑一旦数据可用/成功的行动已经跑了。
有迹象表明,解决了这个问题,我能想到的,但不希望这是可能实现与单一rxjx史诗至少有几个简单的方法。例如:1)其中的史诗只检查数据是可用的,并且如果不是递归失败/重试流调用自身具有小的延迟。 2)请INITIATE
的状态设置一个标志,如果FETCH_SUCCESS
还没有跑,然后听FETCH_SUCCESS
并使其揭开序幕INITIATE
如果在运行时设置该标志。
我想出了不包括这两种方法的唯一方法是在两部史诗写它:
该版本处理FETCH_SUCCESS
INITIATE
(幸福路)看起来像在此之前:
export const initiateFirstEpic = action$ => action$
.ofType(INITIATE)
.skipUntil(Observable.of(FETCH_SUCCESS))
.map(action => {
return LogicAction();
});
和其他处理点击太快,使得INITIATE
前FETCH_SUCCESS
发生:
export const successFirstEpic = action$ => action$
.ofType(INITIATE)
.switchMap(() =>
action$.ofType(FETCH_SUCCESS)
.take(1)
.map(action => {
return LogicAction();
})
);
这似乎并没有工作,也没有真正审视我希望它的方式。有没有达到这个好办法?我很新的RxJS和Redux的可观的,所以答案可能是显而易见的。
我想你要找的是combineLatest。
export const initiateEpic = action$ => Observable
.combineLatest(action$.ofType(INITIATE), action$.ofType(FETCH_SUCCESS).take(1))
.map(([action, _]) => {
return LogicAction();
});
在take(1)
动作可以选择使用FETCH_SUCCESS
ofType
观察到,以防止每次你得到LoginAction
时间生产FETCH_SUCCESS
这是基于@ m1ch4ls但使用操作,而不是一个版本:
const initiateEpic = action$ =>
action$
.combineLatest(action$.ofType(FETCH_SUCCESS).take(1))
.map(([initiateAction, fetch_success_action]) => {
return LogicAction();
});
本来我没把握,有一个静态函数Observable.combineLatest(obs1$, obs2$)
和运营商obs1$.combineLatest(obs2$)
,因此我对@ m1ch4ls答案评论。