我正在使用Angular2进行一个项目,并尝试使用RxJS的功能(以及Firebase作为后端)构建许多高度动态的用户界面。
现在采用以下场景:
this.af.auth
.filter(Boolean)
.switchMap((auth) => this.af.database.object('/usersUid/' + auth.uid));
这将检查用户是否正确登录,如果是,则切换到内部可观察对象,以便访问存储的用户信息(例如管理员属性等)。
这很好用(使用 subscribe() 和模板中的异步管道)。
让我感到困惑的是,当我尝试将可观察量移动到专用服务并检索它时,它将返回可观察量"包装"在数组中。
// in original component
let userObservable = this.databaseSrv.getUserObservable(); // the userObservable will be wrapped as an Array and the component logic breaks
// in database-service
getUserObservable(){
return this.af.auth
.filter(Boolean)
.switchMap((auth) => this.af.database.object('/usersUid/' + auth.uid));
}
我已经尝试了地图/平面地图/合并的不同变体...我返回可观察对象的方式肯定有问题,但我似乎无法理解它。
对这种行为的任何解释将不胜感激。
尝试将userObservable
声明为对象,而不仅仅是声明let userObservable
。数组实际上是对象,因此这可能与您的对象最终成为数组有关。
所以试试:
userObservable:Object = {};
this.userObservable = this.databaseSrv.getUserObservable();
好吧,在AJT_82的帮助下,我现在得到了正确的答案。
getUserObservable(){
return this.af.auth
.filter(Boolean)
.switchMap((auth) => this.af.database.object('/usersUid/' + auth.uid));
}
返回一个可观察量,可以分配给
userObservable:Object = {};
但是后来我无法在其上运行订阅()或异步,这似乎是合乎逻辑的。我之前曾尝试将其声明为
userObservable: Observable<any>
具有相同的奇怪结果(它返回可观察的"包装"在数组中)。我最终通过使用"As FirebaseObjectObservable"得到了解决方案,如下所示:
this.userObservable = this.db.getUserAsObjectObservable() as FirebaseObjectObservable<any>;
this.userObservable.subscribe(data => console.log('Observable', data));
这样,可观察量从服务中返回即可。
再次感谢!