【问题标题】:Returning an observable with switchMap from service will return it wrapped in Array从服务返回一个带有 switchMap 的 observable 将返回它包装在 Array 中
【发布时间】:2017-01-28 23:12:20
【问题描述】:

我正在使用 Angular2 开发一个项目,并尝试使用 RxJS 的功能(以及作为后端的 Firebase)构建大量高度动态的用户界面。

现在假设以下场景:

this.af.auth
  .filter(Boolean)
  .switchMap((auth) => this.af.database.object('/usersUid/' + auth.uid));

这将检查用户是否正确登录,如果是,则切换到内部 observable 以获取存储的用户信息(例如管理属性等)

这很好用(同时使用 subscribe() 和模板中的异步管道)。

让我感到困惑的是,当我试图将 observable 移动到专用服务并检索它时,它将返回 observable “包装”在一个数组中。

// 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));
}

我尝试了 map/flatmap/merge 的不同变体......我返回 observable 的方式肯定有问题,但我似乎无法理解它。

对此行为的任何解释将不胜感激。

【问题讨论】:

    标签: angular observable rxjs5


    【解决方案1】:

    尝试将userObservable 声明为对象,而不是仅仅声明let userObservable。数组实际上是对象,因此这可能与您的对象最终成为数组有关。

    那就试试吧:

    userObservable:Object = {};
    this.userObservable = this.databaseSrv.getUserObservable();
    

    【讨论】:

    • 感谢您的帮助!它不像你描述的那样工作,但它让我走上了正确的轨道。请看下面我的回答。再次感谢你。可悲的是,我还不能投票给你:-(
    • 没问题,很高兴我至少让你走上了正确的道路:D
    【解决方案2】:

    好的,在 AJT_82 的帮助下,我现在得到了正确的答案。

    getUserObservable(){
      return this.af.auth
      .filter(Boolean)
      .switchMap((auth) => this.af.database.object('/usersUid/' + auth.uid));
    }
    

    返回一个 Observable,可以分配给

    userObservable:Object = {};
    

    但是我无法在其上运行 subscribe() 或异步,这似乎是合乎逻辑的。 我之前曾尝试将其声明为

    userObservable: Observable<any>
    

    具有相同的奇怪结果(它返回可观察的“包装”在一个数组中)。我终于通过使用“像这样的 FirebaseObjectObservable 得到了解决方案:

       this.userObservable = this.db.getUserAsObjectObservable() as FirebaseObjectObservable<any>;
       this.userObservable.subscribe(data => console.log('Observable', data));
    

    这样,observable 从服务中返回就好了。

    再次感谢您!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-27
      • 2022-11-09
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      • 2018-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多