【问题标题】:How do I unsubscribe from inner observables in redux observable?如何取消订阅 redux observable 中的内部 observable?
【发布时间】:2019-08-21 08:03:20
【问题描述】:

在下面的史诗中,我正在收听 action$ 流,然后还收听 auth 流 authState(app.auth())

export const fetchAuthStatus = action$ =>
      action$.pipe(
        ofType(AUTH_STATUS_CHECKED),
        switchMap(() => authState(app.auth())),
        switchMap(user =>
          user
            ? of({ type: 'SIGNED_IN', payload: user })
            : signIn(googleAuthProvider)
        ),
        catchError(error => console.log('problems signing in'))
      );

它按预期工作,唯一的问题是,如果我通过注销更改身份验证状态,那么史诗会触发 signIn() 方法,因为 user 不再可用。

登录后如何停止收听authState(app.auth())。史诗般的退订逻辑在哪里?

【问题讨论】:

  • 你能不能通过在返回的 Observable 上应用运算符 take(1) 来从 authState(app.auth()) 中取出第一个元素? IE。 switchMap(() => authState(app.auth()).pipe(take(1))),
  • 谢谢。因此,在我第一次登录时添加 take(1) 效果很好,但如果我注销然后尝试重新登录,则什么也没有。
  • 我认为当您重新登录时会有另一个AUTH_STATUS_CHECKED 操作。然后,新操作将启动一个新的authState(app.auth()) observable in the switchMap. But if the AUTH_STATUS_CHECKED` 操作仅触发一次,这当然行不通。您能否再描述一下您的登录/注销过程应该如何工作?
  • 我想要一个让人们登录的按钮,然后是另一个让人们注销的按钮。差不多就是这样。上面的 if/else 是因为登录按钮使您登录或显示 0Auth 模式,具体取决于您是否已经对此会话进行了身份验证。比如登录后刷新页面,不需要再次登录,就知道会话有效。
  • 我认为,您在这里有两个合乎逻辑的操作。一个应该检查页面加载的授权,另一个应该对登录按钮做出反应。把它一分为二,你会得到你需要的

标签: javascript rxjs rxjs6 redux-observable unsubscribe


【解决方案1】:

只要您的应用正在运行,Epic 就应该一直存在。

你没有完成它们,你将它们静音。

要使流静音,有很多可能性。例如,windowToggle 运算符将允许您通过其他流(例如,通过其他事件的流)静音您的 observable。

例如您在SIGN_IN — SIGN_OUT 序列之间使史诗静音。并在SIGN_OUT — SIGN_IN 期间取消静音。

这是different pausing strategies with rxjs上的一篇文章。

希望对你有帮助

【讨论】:

  • 谢谢 Kos,那么我该如何忽略这个具体的例子呢?
  • 当你说史诗总是运行时,这是否意味着 redux-observables 在应用卸载时处理取消订阅?如果不是,这不会导致内存泄漏吗?
  • @JoshPittman,好吧,库有责任初始化完成action$ 流。你不用担心这个。
猜你喜欢
  • 2017-12-17
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
  • 2020-08-29
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
相关资源
最近更新 更多