angular - RxJs Observable in Observable from Array

标签 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 }
]

最佳答案

使用扫描运算符聚合

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

关于angular - RxJs Observable in Observable from Array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59101004/

相关文章:

javascript - 通过路由器导出 Angular 6 访问元素

angular - docker :什么是运行 Angular 最好的选择?

Angular Material 步进器 : disable header navigation

angular - 我想将一个对象传递给子组件。我做了一切,但没有任何效果。 ( Angular )

javascript - .subscribe() 函数有什么作用?

javascript - 具有重试和延迟的 Angular HttpClient 请求正在发送一个额外的请求然后取消它

javascript - 我想用 Angularfire2 计算 Firebase 上的 ShoppingCart 的总和

angular - 在 angularfire 应用程序中创建时间戳对象

javascript - 使用当前日期作为条件从 firebase 检索数据

angular - Angular6 ngModelChange 中的去抖时间