在 redux-observable 中使用 rxjs 示例来监听其他操作

Using rxjs sample within redux-observable to listen to other actions

我正在使用 redux-observable 作为调度操作和商店之间的中间件。我正在尝试使用 rxjs sample 函数来完成此操作,但不幸的是它对我不起作用。这是我的史诗:

export const inviteUserEpic = (action$) => {
    return action$.ofType(a.INVITE_USER)
    .flatMap(({ body }) => {
        return Observable.concat(
            Observable.of({ type: authActions.REGISTER_REQ, body }),
            Observable.of(push(`/team/${body.teamId}`))
            .sample(action$.ofType(authActions.REGISTER_SUCCESS))
        );
    });
};

基本上这个想法是有多个地方可以注册新用户,在这种情况下,我想在成功注册用户后重定向到团队页面。我看到 REGISTER_REQ 发出,随后它会发出 REGISTER_SUCCESS。但是从未对重定向可观察对象进行采样。

这是因为 sample 运算符仅在源本身仍处于活动状态时才处于活动状态并订阅通知程序。在这种情况下,源是一个 Observable.of(),它将发出提供的操作,然后立即 complete(),这意味着您将不再采样任何东西——它已经 complete() 在您的 [=16] 之前=] 动作被调度。即 .sample() 不会阻止可观察链完成。

相反,您需要先匹配预期的操作,然后在匹配时将其映射到您的 push()。您可能还想只听 REQUEST_SUCESS 一次,而不是无限期地听,所以您需要添加一个 .take(1)

action$.ofType(authActions.REGISTER_SUCCESS)
  .take(1)
  .map(() => push(`/team/${body.teamId}`))

将其与您现有的 Epic 放在一起

export const inviteUserEpic = (action$) => {
    return action$.ofType(a.INVITE_USER)
    .flatMap(({ body }) => {
        return Observable.concat(
            Observable.of({ type: authActions.REGISTER_REQ, body }),
            action$.ofType(authActions.REGISTER_SUCCESS)
              .take(1)
              .map(() => push(`/team/${body.teamId}`))
        );
    });
};

你可以在这里看到一个工作示例:http://jsbin.com/sonuqob/edit?js,output