我正在使用angularfire,并且获得了包含任务ID的连续数组。我需要获取数组中每个ID的任务文档作为新的可观察对象。然后将一系列任务文档返回到流中,以便我可以在组件中订阅它并显示任务列表。
到目前为止,我已经将其与mergeMap一起使用。我拆分数组并获取任务文档,然后将其返回到流中。我的解决方案的唯一问题是,当我订阅Observable时,我没有得到一系列任务,但是每个任务都是一个单独的更改,我无法使用ngFor进行循环。在这种情况下,使用toArray()运算符不起作用,因为它是一个永无止境的连续流。
到目前为止,这是我的代码:
this.db.collection(`games/${gameId}/missions`).valueChanges().pipe(
mergeMap(missions => missions),
mergeMap((mission: any) => {
return this.db.doc(`missions/${mission.id}`).snapshotChanges();
}),
);
这会在单个事件中生成以下输出:
{ id: 1, missionProperties }
{ id: 2, missionProperties }
{ id: 3, missionProperties }
但是我想一次完成一系列任务:
[
{ id: 1, missionProperties },
{ id: 2, missionProperties },
{ id: 3, missionProperties }
]
答案 0 :(得分:1)
您可以使用缓冲区运算符https://www.learnrxjs.io/operators/transformation/buffer.html
of(1, 2, 3, 4, 5).pipe(
bufferCount(5),
).subscribe(x => console.log(x)); // prints [1, 2, 3, 4, 5]
已编辑:
我刚刚看到了toArray()运算符:
of(1, 2, 3, 4, 5).pipe(
toArray(),
).subscribe(x => console.log(x));
编辑2:
of(1, 2, 3, 4, 5).pipe(
scan((acc, curr) => { acc.push(curr); return acc; }, []),
).subscribe(x => console.log(x)); // prints [1] [1,2] [1,2,3]....
答案 1 :(得分:0)
使用扫描运算符聚合
this.db.collection(`games/${gameId}/missions`).valueChanges().pipe(
switchMap(missions =>
from(missions).pipe(
mergeMap(mission => this.db.doc(`missions/${mission.id}`).snapshotChanges()),
scan((acc, curr) => [curr, ...acc], [])
),
)