【问题标题】:Using rxjs sample within redux-observable to listen to other actions在 redux-observable 中使用 rxjs 示例来监听其他操作
【发布时间】:2017-03-17 15:54:27
【问题描述】:

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

【问题讨论】:

    标签: javascript rxjs redux-observable


    【解决方案1】:

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

    【讨论】:

    • @Jake Dluhy 我忘了提到你可能不想永远听REGISTER_SUCCESS,在这种情况下你应该添加一个.take(1),以便在第一场比赛后完成。我已经相应地编辑了我的答案。
    • 谢谢!我想到的另一件事是如果请求失败,想取消重定向。我添加了.takeUntil(action$.ofType(authActions.REGISTER_FAILURE)),这似乎有效。
    • 是的,这很完美。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    • 2021-06-04
    相关资源
    最近更新 更多