当前位置: 首页 > 知识库问答 >
问题:

RxJs在阵列中可观测

郭永怡
2023-03-14

我正在使用angularfire,我得到了一个连续的阵列流,其中包含任务ID。我需要获取数组中每个id的任务文档作为一个新的可观察的。然后将任务文档数组返回到流中,这样我就可以在组件中订阅它并显示任务列表。

到目前为止,我用mergeMap得到了它。我分割阵列,获取任务文档并将它们返回到流中。我的解决方案唯一的问题是,当我订阅可观察到的时,我没有得到一系列任务,但每个任务都是一个单一的变化,我不能循环使用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个答案

叶德本
2023-03-14

可以使用缓冲区运算符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]....
齐意致
2023-03-14

使用扫描运算符聚合

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], [])
      ),
)
 类似资料:
  • 在我的应用程序中,我一直在努力进行一些基本的更改检测。我已经这样做了几天了,而且失去了意志!我想知道这里是否有人能给我指出正确的方向。 我有一个和2个列表。一个是给,另一个是给。 此方法连接到数据库以获取对象列表,每个对象都有一个值。现在我想使用这些键去获取每个用户的实际。我什么都试过了,似乎是我唯一能工作的东西。 因此,两者都调用函数,我在模板上使用管道。 我的函数是这样的。 但是,Angula

  • 我有一个沙盒,它订阅了一个消息流,我想过滤该流,以查找已发送到或从特定用户使用另一个组件中指定的路由参数接收的消息。 messages.sandbox.ts: messages.detail.container.ts this.matching消息$似乎只包括this.received消息$但是我知道this.sent消息$不是空,因为我可以在我的模板中使用它没有问题。 我是不是遗漏了一些合并观测

  • 使用rxjsv6 所以我有多个我想要跟踪/观察的变量,当它们中的任何一个发生变化时,触发一个可观察对象来调用一个API,该API然后根据这些变量更新其他内容。 我想我可能会在上触发一个事件来强制可观察对象做一些事情,但它不会根据我想要的返回结果 例如。 然而,在可观测数据上没有订阅方法。我试图修改我的另一个观察值(这是可行的)

  • 我有一个服务,有一个方法foo。在该方法中,我订阅了一个可观察的(超文本传输协议-客户端)。 我喜欢从foo返回一个布尔值,该值取决于get。这不起作用,因为http.get是asynchrouns-在http.get完成之前调用return。 我怎样才能使这个同步? 编辑 返回可观察的布尔值在这里不是一个选项。这是因为我处理get in foo的响应(此处未显示),但我也需要根据它的返回来执行f

  • 我有2个API调用第二个调用使用第一个调用返回的东西。有了promise,这很容易: 我将如何使用可观测数据来实现这一点?

  • 在组件中: 在init上,我可以观察到 如何获取当前值,如?