我使用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。但重定向可观察量从未被采样过。
答案 0 :(得分:2)
这是因为sample
运算符仅在源本身仍处于活动状态时才处于活动状态并订阅通知程序。在这种情况下,来源是Observable.of()
,它将发出提供的操作,然后立即complete()
,这意味着您将不再采样任何内容 - 它已经complete()
在{{1}之前调度动作。即REGISTER_SUCCESS
并不妨碍可观察的链条完成。
相反,您需要首先匹配预期的操作,然后匹配映射到您的.sample()
。您可能还希望只听一次push()
,而不是无限期,因此您需要添加REQUEST_SUCESS
.take(1)
将它与现有的Epic
结合在一起action$.ofType(authActions.REGISTER_SUCCESS)
.take(1)
.map(() => push(`/team/${body.teamId}`))
你可以在这里看到一个有效的例子:http://jsbin.com/sonuqob/edit?js,output