Javascript 在redux observable中使用rxjs示例来侦听其他操作

Javascript 在redux observable中使用rxjs示例来侦听其他操作,javascript,rxjs,redux-observable,Javascript,Rxjs,Redux Observable,我使用redux observable作为调度操作和存储之间的中间件。我试图使用rxjssample函数来实现这一点,但不幸的是,它对我不起作用。这是我的史诗: export const inviteUserEpic = (action$) => { return action$.ofType(a.INVITE_USER) .flatMap(({ body }) => { return Observable.concat( Ob

我使用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
操作符仅处于活动状态,并且在源本身仍处于活动状态时订阅通知程序。在这种情况下,源是一个
可观察的.of()
,它将发出提供的操作,然后立即执行
complete()
,这意味着您将不再对任何内容进行采样—在调度
注册成功之前,它已经是
complete()
。i、 e.
.sample()
不会阻止可观察链的完成

相反,您需要先匹配预期的操作,然后在匹配时将其映射到您的
push()
。您可能还希望只侦听一次
请求成功
,而不是无限期,因此您需要添加一个
。取(1)

action$类型(authoctions.REGISTER\u SUCCESS)
.采取(1)
.map(()=>push(`/team/${body.teamId}`)
把它和你现有的史诗结合起来

export const inviteUserEpic=(action$)=>{
返回类型为的操作$(a.INVITE\u用户)
.flatMap(({body})=>{
返回可观察的.concat(
可观察的({type:authActions.REGISTER_REQ,body})的,
类型的action$(authActions.REGISTER\u成功)
.采取(1)
.map(()=>push(`/team/${body.teamId}`)
);
});
};

你可以在这里看到一个有效的例子:

@Jake Dluhy我忘了提到你可能不想永远听
注册成功
,在这种情况下,你应该添加一个
。取(1)
,这样它在第一场比赛后就完成了。我已经相应地编辑了我的答案。谢谢!我想到的另一件事是,如果请求失败,我想取消重定向。我添加了
.takeUntil(action$.ofType(authActions.REGISTER\u FAILURE))
,这似乎很有效。是的,这太完美了。