继续终极版之前观察到等待第二个异步操作

问题描述 投票:2回答:2

我有一个场景两个动作:

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();
  });

和其他处理点击太快,使得INITIATEFETCH_SUCCESS发生:

export const successFirstEpic = action$ => action$
.ofType(INITIATE)
.switchMap(() =>
  action$.ofType(FETCH_SUCCESS)
    .take(1)
    .map(action => {
       return LogicAction();
    })
);

这似乎并没有工作,也没有真正审视我希望它的方式。有没有达到这个好办法?我很新的RxJS和Redux的可观的,所以答案可能是显而易见的。

rxjs redux-observable
2个回答
1
投票

我想你要找的是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


0
投票

这是基于@ 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答案评论。

© www.soinside.com 2019 - 2024. All rights reserved.