链式 Observable 和 Promises
Chain Observables and Promises
我正在使用 Firebase Auth (AngularFire) 和 Angular6 构建一个应用程序。我还有一个 MongoDB 角色基础访问 (RBA) 服务
我需要做 3 件事来解决用户是否可以访问 URL 路径:
- 监听当前用户的 Firebase authState Observable
- 获取他最新的令牌 ID
- 检查 MongoDB 是否允许用户访问 URL
当所有 3 个都通过时,它应该 return true
我研究了一些 Observables 但仍然感到困惑,特别是因为我使用的是 rxjs 6 并且很多链接仍然引用 before-5.5
这是我现在的 canActivate 函数:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot)
{
return this.authService.user$.pipe(map (user => {
//user.getIdToken() returns a Promise so I wrap it in an Observable
return from(user.getIdToken());
})).pipe(map( tokenValue => {
//tokenValue is an Observable here
this.mongoDBService.validate(tokenValue, state.url);
}));
}
我期待第二个 "pipe" 能够收听并接收 from(user.getIdToken())
的结果
这不应该是这样吗?如果没有,有人可以指导我如何将这 2 个 observable 链接在一起吗?
谢谢
您需要使用 switchMap
(将可观察到的结果链接到主流中)而不是 map
(将发出的值简单地映射到其他东西)。你也只能使用管道一次:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
return this.authService.user$.pipe(
switchMap (user => from(user.getIdToken())),
switchMap(tokenValue => this.mongoDBService.validate(tokenValue, state.url))
);
}
我不确定什么是 user.getIdToken()
以及您是否需要 from
。但是你的主要问题应该通过这个解决。
我正在使用 Firebase Auth (AngularFire) 和 Angular6 构建一个应用程序。我还有一个 MongoDB 角色基础访问 (RBA) 服务
我需要做 3 件事来解决用户是否可以访问 URL 路径:
- 监听当前用户的 Firebase authState Observable
- 获取他最新的令牌 ID
- 检查 MongoDB 是否允许用户访问 URL
当所有 3 个都通过时,它应该 return true
我研究了一些 Observables 但仍然感到困惑,特别是因为我使用的是 rxjs 6 并且很多链接仍然引用 before-5.5
这是我现在的 canActivate 函数:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot)
{
return this.authService.user$.pipe(map (user => {
//user.getIdToken() returns a Promise so I wrap it in an Observable
return from(user.getIdToken());
})).pipe(map( tokenValue => {
//tokenValue is an Observable here
this.mongoDBService.validate(tokenValue, state.url);
}));
}
我期待第二个 "pipe" 能够收听并接收 from(user.getIdToken())
的结果这不应该是这样吗?如果没有,有人可以指导我如何将这 2 个 observable 链接在一起吗?
谢谢
您需要使用 switchMap
(将可观察到的结果链接到主流中)而不是 map
(将发出的值简单地映射到其他东西)。你也只能使用管道一次:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
return this.authService.user$.pipe(
switchMap (user => from(user.getIdToken())),
switchMap(tokenValue => this.mongoDBService.validate(tokenValue, state.url))
);
}
我不确定什么是 user.getIdToken()
以及您是否需要 from
。但是你的主要问题应该通过这个解决。