Angular中获取Firestore所有businesses的candidates子集合?现有函数不符预期
解决Angular中获取Firestore嵌套子集合数据的问题
你的代码问题在于,处理每个business的candidates时返回的是Observable对象,但外层的map操作只是把这些Observable收集成了数组,没有将它们合并成一个能发出最终数据数组的Observable。所以你需要用RxJS的操作符来合并这些内部的Observable。
修正后的代码:
import { forkJoin, Observable } from 'rxjs'; import { map, mergeMap } from 'rxjs/operators'; getAllCandidates(): Observable<{ businessId: string; candidates: any[] }[]> { return this.firestore.collection('businesses').snapshotChanges().pipe( // 转换business快照,生成每个business对应的candidates Observable map(businesses => businesses.map(business => { const businessId = business.payload.doc.id; const candidates$ = this.firestore .collection(`businesses/${businessId}/candidates`) .snapshotChanges() .pipe( map(candidates => ({ businessId, candidates: candidates.map(c => c.payload.doc.data()) })) ); return candidates$; }) ), // 合并所有candidates Observable,等待全部完成后返回结果数组 mergeMap(candidateObservables => forkJoin(candidateObservables)) ); }
关键说明:
- forkJoin:等待所有传入的Observable执行完成后,将结果按顺序收集为一个数组发出,适合需要获取所有子集合完整数据的场景。
- mergeMap:把外层Observable发出的Observable数组,转换成一个发出合并后最终结果的Observable。
- 如果需要实时监听数据变化(而非仅获取一次),可以将
forkJoin替换为combineLatest,这样任何子集合数据更新时,整个结果都会同步刷新。
内容的提问来源于stack exchange,提问作者Norest
相关产品推荐
相关产品推荐

