问题描述
在成功获取我用于后续 db 调用的子集合的所有引用后,我尝试将结果合并到单个 Observable 数组中。
现在,每次解析课程引用和使用 loadAllLessons()
进行数据库查询时,snapshotChanges()
函数的订阅内的值都会更新为单个数组。
Firestore 数据库中的目标子集合(课程)嵌套在集合(课程)中。我的代码看起来很像这样:
getAllLessonsRef(): Observable<string[]> {
return this.db.collection('/courses')
.snapshotChanges()
.pipe(map(snap => snap.map(s => {
const courseId = s.payload.doc.id;
const lessonRef = `/courses/${courseId}/lessons`;
return lessonRef
})));
}
loadAllLessons(): Observable<any> {
return this.getAllLessonsRef()
.pipe(switchMap(lessonRefs => {
let items =
lessonRefs.map(ref => {
console.log(ref)
return this.db.collection(`${ref}`).snapshotChanges()
});
return merge(...items)
}),map(list => {
return convertSnaps<Lesson>(list)
}))
}
合并所有后续结果的最佳方法是什么?
解决方法
我可能会为此使用 forkJoin
。详细了解 forkJoin here。
import { forkJoin } from 'rxjs';
....
loadAllLessons(): Observable<any> {
return this.getAllLessonsRef()
.pipe(switchMap(lessonRefs => {
return forkJoin(...lessonRefs.map(ref => this.db.collection(`${ref)`).snapshotChanges()));
}),map(list => {
return convertSnaps<Lesson>(list)
}))
}
,
我使用旧代码找到的解决方案是在订阅方法中加入结果
this.lessonService.loadAllLessons()
.subscribe(
lessons => {
lessons.map(lesson => {
this.allLessons.push(lesson)
})
}
)