使用switchMap RxJS时如何处理可能返回空的可观察对象

时间:2018-11-13 04:17:34

标签: angular rxjs angularfire2

如何用RxJS处理以下情况?

我有一个可观察的对象,它通过从url参数中提取的ID在Firestore数据库中查询提交内容:

this.submission$ = this.db.collection$('submissions', ref => ref.where('submissionArtistUID', '==', this.artistParam));

对于预订此可观察元素的元素,submission$返回一个提交对象数组。因此,switchMap解决后,我就可以使用users查询我的submission$表:

this.user$ = this.submission$.pipe(
  switchMap(
    (submissions) => {
      return this.db.collection$('users', ref => ref.where('userUID', '==', submissions[0].submissionUserUID ))
    }
  )
)

但是,不能保证提交查询返回任何内容。因此,当我在返回空白的提交中使用switchMap时,无法访问以下属性:submissions[0].submissionUserUID,并且在控制台中显示此错误:

Cannot read property 'submissionUserUID' of undefined

这很有意义,因为submission$在尝试在switchMap的return语句中使用之前先解析为空对象。

那么,如何使用RxJS解决这种情况? switchMap使用正确吗?谢谢!

1 个答案:

答案 0 :(得分:3)

您可以在切换映射之前使用过滤器运算符。您的代码可能看起来像这样。

this.user$ = this.submission$.pipe(
filter(submissions => Object.keys(submissions).length > 0),
  switchMap(
    (submissions) => {
      return this.db.collection$('users', ref => ref.where('userUID', '==', submissions[0].submissionUserUID ))
    }
  )
)