【问题标题】:How to handle an observable that may return empty when using switchMap RxJS如何处理使用 switchMap RxJS 时可能返回空的 observable
【发布时间】:2019-04-15 20:34:21
【问题描述】:

RxJS 应该如何处理以下场景?

我有一个 observable,它通过从 url 参数中提取的 ID 查询我的 Firestore 数据库的提交:

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

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

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 的返回语句中使用之前解析为一个空对象。

那么我该如何使用 RxJS 来解释这样的场景呢? switchMap 是正确的使用方法吗?谢谢!

【问题讨论】:

    标签: angular rxjs angularfire2


    【解决方案1】:

    您可以在 switchmap 之前使用过滤器运算符。您的代码可能如下所示。

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

    【讨论】:

    • 非常简洁,过滤器成功了!感谢您教我该运算符的应用程序:)
    • 太棒了。很高兴为您提供帮助
    猜你喜欢
    • 2023-03-17
    • 2020-12-21
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 2019-08-05
    • 2020-02-05
    相关资源
    最近更新 更多