2

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

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。但是重定向 observable 永远不会被采样。

4

1 回答 1

2

这是因为sample操作员仅在源本身仍处于活动状态时才处于活动状态并订阅通知程序。在这种情况下,源是一个Observable.of()将发出提供的动作然后立即发出的complete(),这意味着您将不再采样任何东西——它已经complete()在您的REGISTER_SUCCESS动作被调度之前。ie.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

于 2016-11-03T23:59:53.437 回答