从服务返回带有 switchMap 的可观察对象将返回包装在 Array 中的可观察量



我正在使用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));

这样,可观察量从服务中返回即可。

再次感谢!

最新更新