【问题标题】:RxJS - switchMap not emitting value if the input observable is empty arrayRxJS - 如果输入 observable 为空数组,则 switchMap 不会发出值
【发布时间】:2017-01-18 15:43:27
【问题描述】:

我有一个设置,我可以在其中查询 firebase 以获取用户最喜欢的帖子列表。

基本上,首先我会查询用户的点赞,然后为每个点赞获取相应的帖子 - 所有这些都在一个可观察的序列中。

当用户不喜欢剩下的唯一帖子时,就会出现问题。在这种情况下(当 likes 数组变为空时)观察对象不会触发任何内容并且视图不会更新(始终存在至少一个帖子)。

一方面,这种行为似乎合乎逻辑且可以理解,但另一方面,即使 switchMap 的输入为空,我也不确定如何使最终的 Observable 发出。也许应该改变运营商。

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$;
}

【问题讨论】:

  • 我认为当 likes 数组为 null 时应该抛出一个错误并且它正在停止链你可以尝试添加一个 catch
  • 谢谢你的想法,伙计。它可能会起作用。其实我会试试看的:)
  • 找到了一个很好的解决方案。看看吧。

标签: angular firebase rxjs angularfire2 angular2-observables


【解决方案1】:

通过在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$;
}

【讨论】:

  • 这对我来说是救命稻草!
【解决方案2】:
.switchMap((likes) => likes.length > 0 ?
   Observable.combineLatest(
    likes.map(like => this.af.database.object("/posts/" + like.$key).first():
   Observable.empty() // if emit empty() then .map() will not run 
 )
 .map(...)

【讨论】:

  • 您能否在您的答案周围添加更多解释?
  • 对于 siwtchMap().map() 链。如果在 switchMap 中返回空的 Observable (Observable.empty()),则不会触发 .map() 链。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-27
  • 2013-11-14
  • 2021-10-25
  • 2021-07-02
  • 2019-01-17
  • 1970-01-01
相关资源
最近更新 更多