【发布时间】:2019-03-24 05:40:34
【问题描述】:
我使用 angularFirestore 在 firebase 上进行查询,我想使用 DocumentReference 连接来自多个文档的数据。
管道中的第一个运算符映射返回一个IOrderModelTable数组,第二个运算符,即switchMap迭代数组,每个元素使用每个元素中包含的id来查询其他表中的数据。
问题在于,在 swithMap 中,由于动画地图运算符,我获得了一个可观察的数组。如何获取 IOrderModelTable 数组,然后返回该数组的 observable。
代码是:
getDataTableOperatorsFromDB(): Observable<IOrderModelTable[]> {
const observable = this.tableOperatorsCollectionsRef.snapshotChanges().pipe(
map(actions => {
return actions.map(a => {
const data = a.payload.doc.data() as IOrdersModelDatabase;
const id = a.payload.doc.id;
data.ot = id;
return data;
});
}),
switchMap(data => {
const result = data.map(element => {
return this.afs.collection('Orders/').doc(element.orderNumberReference.id).valueChanges().pipe(map(order => {
return {
otNumber: element.ot,
clientName: '',
clientReference: order.clientReference,
id: element.orderNumberReference,
};
}));
});
// Result must be an IOrderModelTable[] but is a Observable<IOrderModelTable>[]
return of(result);
})
);
【问题讨论】:
-
当你使用
switchMap时,你需要输出一个observable。因此,您可以将 switchMap 替换为另一个运算符(如 map、concat 等)。或者,您可以将可观察到的排放转换为列表,为此使用toArray()。非常重要:如果您的 observable 没有终止,则 toArray 将不起作用。不过,我不确定是否能很好地理解您的问题,一些解释将有助于“为什么使用 switchMap”或“您的 observable 发出几次,还是只发出一次”? -
@madjaoue observable 永远不会完成并发出一个包含来自 firebase 的所有文档的唯一数组,我想将该数组转换为每个元素的其他文档的查询。假设 observable 返回一个对象数组,每个对象包含一个订单号和客户的 id,我需要获取客户的名称,为此我使用 id,并与订单号结合,这样我就有了一个对象数组,每个对象包含一个客户名称和订单号。
-
我发了一个答案,你可以试试吗?
标签: javascript angular rxjs