我在其中查询Firebase以获得用户喜欢的帖子列表的设置。

基本上,首先我查询用户喜欢,然后为每个喜欢获得相应的帖子-全部按一个可观察的顺序进行。

当用户不喜欢唯一的左侧帖子时,就会出现问题。在这种情况下(当点赞数组变为空时)不会从可观察对象触发任何操作,并且不会更新 View (始终至少存在一个帖子)。

一方面,这种行为看起来合乎逻辑并且可以理解,但是另一方面,即使switchMap的输入为空,我也不确定如何使最终Observable发出。也许应该更改运算符(operator)。

getUserFavourites(userId = ""):Observable<Post[]>
{
  if (!this.userFavourites$) {
    this.userFavourites$ = this.af.database.list('/ranks_by_user/' + userId, {
        query: {
          limitToFirst: 50
        }
      }) //Emits value here (even empty array)
      .switchMap((likes: any[]) => Observable.combineLatest(
        likes.map(like => this.af.database.object("/posts/" + like.$key).first())
      )) //Does not emit new value here if likes array was empty
      .map(p => {
        return p.map(cit => Post.unpack(p));
      }).publishReplay(1).refCount()
  }
  return this.userFavourites$;
}

最佳答案

通过在switchMap中添加条件解决了该问题:

原始-https://github.com/ReactiveX/rxjs/issues/1910

getUserFavourites(userId = ""):Observable<Post[]>
{
  if (!this.userFavourites$) {
    this.userFavourites$ = this.af.database.list('/ranks_by_user/' + userId, {
        query: {
          limitToFirst: 50
        }
      }) //Emits value here (even empty array)
      .switchMap((likes: any[]) => {
      return likes.length === 0 ?
        Observable.of(likes) :
        Observable.combineLatest(
          likes.map(like => this.af.database.object("/citations/" + like.$key))
      )
    }) //Emits either combined observables array or empty array
      .map(p => {
        return p.map(cit => Post.unpack(p));
      }).publishReplay(1).refCount()
  }
  return this.userFavourites$;
}

10-06 11:48