【发布时间】: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 theswitchMap. But if theAUTH_STATUS_CHECKED` 操作仅触发一次,这当然行不通。您能否再描述一下您的登录/注销过程应该如何工作? -
我想要一个让人们登录的按钮,然后是另一个让人们注销的按钮。差不多就是这样。上面的 if/else 是因为登录按钮使您登录或显示 0Auth 模式,具体取决于您是否已经对此会话进行了身份验证。比如登录后刷新页面,不需要再次登录,就知道会话有效。
-
我认为,您在这里有两个合乎逻辑的操作。一个应该检查页面加载的授权,另一个应该对登录按钮做出反应。把它一分为二,你会得到你需要的
标签: javascript rxjs rxjs6 redux-observable unsubscribe