可从阵列观察到的RxJs

时间:2019-11-29 08:10:37

标签: angular rxjs angularfire2 rxjs6

我正在使用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 }
]

2 个答案:

答案 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], [])
      ),
)