angular - Firebase 身份验证 RxJs 的嵌套排气映射和连接映射
问题描述
我正在尝试实现 Firebase 身份验证并将接收到的用户数据发送到服务器以在我的应用中创建帐户。
这是代码:
ngAfterViewInit(): void {
const provider = new firebase.auth.GoogleAuthProvider();
fromEvent(this.LoginWithGoogle.nativeElement, 'click')
.pipe(
exhaustMap(() =>
from(this.afAuth.signInWithPopup(provider)).pipe(
map((data) => data.user),
concatMap((user) =>
this.authService.loginWithGoogle({
email: user.email,
username: user.displayName,
})
)
)
)
)
.subscribe((res) => {
console.log(res);
});
}
它运作良好。但是像这样使用嵌套的 RxJs 运算符是否正确?这种情况有什么替代解决方案吗?
解决方案
我认为这会起作用:
ngAfterViewInit(): void {
const provider = new firebase.auth.GoogleAuthProvider();
fromEvent(this.LoginWithGoogle.nativeElement, 'click')
.pipe(
exhaustMap(() => from(this.afAuth.signInWithPopup(provider))),
map((data) => data.user),
concatMap((user) => this.authService.loginWithGoogle({
email: user.email,
username: user.displayName,
})
)
)
.subscribe((res) => {
console.log(res);
});
}
当您使用自动处理内部 observablesswitchMap
之类的运算符时exhaustMap
,您可以简单地想象mergeMap
,与其手动订阅回调返回,不如让该工作由运算符完成。除此之外,内部 observable发出的值会传递给外部 observable(大多数时候 - 主流)。这就是为什么我能够在保存级别上使用.concatMap
map
exhaustMap
编辑
如果你还想处理内部 observables 中的错误,你可以使用这样的东西:
exhaustMap(() => from(...).pipe(catchError(() => EMPTY)))
推荐阅读
- recursion - 使用递归检查数字是否为素数
- c++ - 如何正确地将内在和外在矩阵转换为opengl投影和视图矩阵
- java - servlet中的doPost方法没有被调用
- php - 在函数 PHP OOP 之后使用函数
- ubuntu - 为什么在 Ubuntu 液滴的 DigitalOcean 控制台上输入命令会使我的计算机的 CPU 在命令运行的整个过程中都处于活动状态?
- sql-server - 在 SQL Server 视图中进行计算
- codenameone - 代号一 PickerComponent setStartDate 和 setEndDate 用法
- c# - Azure Functions HTTP 集成测试
- rest - 带有 JAX-RS 的 REST:在 Tomcatv7.0 上使用 @ApplicationPath 扩展应用程序类会产生 404 错误
- c - 指向内存负地址的 C 编译器行为是什么?