使用 switchMap RxJS 时如何处理可能 return 为空的可观察对象
How to handle an observable that may return empty when using switchMap RxJS
RxJS应该如何处理以下场景?
我有一个 observable,它通过从 url 参数中提取的 ID 查询我的 Firestore 数据库以获取提交:
this.submission$ = this.db.collection$('submissions', ref => ref.where('submissionArtistUID', '==', this.artistParam));
对于订阅此可观察对象的元素,submission$
return 是一个提交对象数组。因此,一旦 submission$
已解决,我可以使用 switchMap
查询我的 users
table:
this.user$ = this.submission$.pipe(
switchMap(
(submissions) => {
return this.db.collection$('users', ref => ref.where('userUID', '==', submissions[0].submissionUserUID ))
}
)
)
但是,提交查询不保证 return 任何东西。因此,当我在 return 为空的提交上使用 switchMap
时,我无法访问以下 属性:submissions[0].submissionUserUID
,并且在控制台中显示此错误:
Cannot read property 'submissionUserUID' of undefined
这是有道理的,因为 submission$
在尝试在 switchMap 的 return 语句中使用之前解析为空对象。
那么我该如何使用 RxJS 来解释这样的场景呢? switchMap 是正确的使用方法吗?谢谢!
您可以在 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 ))
}
)
)
RxJS应该如何处理以下场景?
我有一个 observable,它通过从 url 参数中提取的 ID 查询我的 Firestore 数据库以获取提交:
this.submission$ = this.db.collection$('submissions', ref => ref.where('submissionArtistUID', '==', this.artistParam));
对于订阅此可观察对象的元素,submission$
return 是一个提交对象数组。因此,一旦 submission$
已解决,我可以使用 switchMap
查询我的 users
table:
this.user$ = this.submission$.pipe(
switchMap(
(submissions) => {
return this.db.collection$('users', ref => ref.where('userUID', '==', submissions[0].submissionUserUID ))
}
)
)
但是,提交查询不保证 return 任何东西。因此,当我在 return 为空的提交上使用 switchMap
时,我无法访问以下 属性:submissions[0].submissionUserUID
,并且在控制台中显示此错误:
Cannot read property 'submissionUserUID' of undefined
这是有道理的,因为 submission$
在尝试在 switchMap 的 return 语句中使用之前解析为空对象。
那么我该如何使用 RxJS 来解释这样的场景呢? switchMap 是正确的使用方法吗?谢谢!
您可以在 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 ))
}
)
)