gpt4 book ai didi

javascript - rxjs 可观察管道内的建模和 if/else 模式

转载 作者:行者123 更新时间:2023-12-01 01:08:06 25 4
gpt4 key购买 nike

我有一个史诗,我正在监听一个操作流,当'AUTH_STATUS_CHECKED'操作发生时切换到一个新的可观察authState(app.auth()).这个新的可观察值告诉我我是否通过了身份验证。

如果 auth observable 返回用户,则调度 'SIGNED_IN' 操作,并将该用户作为负载。

如果用户不存在,则取消 promise app.auth().signInWithPopup(googleAuthProvider),并在收到响应时调度'SIGNED_IN'

如果有任何错误,请捕获它们并在控制台中告诉我。

根据上面的逻辑,我实现了下面的管道

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

它没有按预期工作。如果没有用户, promise 将被触发,但它不会等待响应,并且调度永远不会被触发。

我显然是 rxjs 的新手,而且我很难弄清楚这一点。我已经阅读了文档并尝试使用 tap() 和 mergeMap() 但遇到了相同的错误。

如有任何指导,我们将不胜感激。

最佳答案

但是,您的代码可以稍微优化一下并建议以更好的方式进行操作,您在这里缺少的是 map 需要一个普通对象,而 switchMap期望一个 PromiseObservable 对象。

const signIn = (authProvider) => app.auth().signInWithPopup(googleAuthProvider)
.then(user => ({ type: 'SIGNED_IN', payload: user }));

export const fetchAuthStatus = action$ =>
action$.pipe(
ofType('AUTH_STATUS_CHECKED'),
switchMap(() => authState(app.auth())),
switchMap(user => user // <-- switchMap handle Promises or Observables
? of({ type: 'SIGNED_IN', payload: user }) // <-- returning an observable
: signIn(googleAuthProvider) // <-- returning a promise
),
catchError(error => console.log('problems signing in'))
);

注释:

  • 不要嵌套管道运算符,尽量使用一个管道
  • 在 Rx 流之外提取复杂的方法
  • 使用of运算符将普通对象转换为Observable

关于javascript - rxjs 可观察管道内的建模和 if/else 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55432959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com