如何结合父母和依赖的孩子可观察

飞龙

有一个未完成的事件对象的连续流。每个事件都有乐队。通过订阅事件,您将获得一个具有多个属性的事件,其中一个属性“bands”存储了一个 bandId 数组。使用这些 ID,您可以获得每个频段。(波段流也是连续的。)

问题:最后,您不仅希望拥有乐队,而且还希望拥有一个带有 bandIds 和完整乐队对象的完整事件对象。

// This is what I could come up with myself, but it seems pretty ugly.

getEvents().pipe(
    switchMap(event => {
        const band$Array = event.bands.map(bandId => getBand(bandId));
        return combineLatest(of(event), ...band$Array);
    })),
    map(combined => {
        const newEvent = combined[0];
        combined.forEach((x, i) => {
            if (i === 0) return;

            newEvent.bands = {...newEvent.bands, ...x};
        })
    })
)

问题:请帮助我找到一种更简洁的方法来做到这一点(我什至不确定我的尝试是否会产生预期的结果)。

皮奇

接受的答案

getEvents().pipe(
    switchMap(event => {
        const band$Array = event.bands.map(bandId => getBand(bandId));
        return combineLatest(band$Array).pipe(
          map(bandArray => ({bandArray, event}))
        );
    })
)

原答案

你可能想尝试一些类似的东西

getEvents().pipe(
    switchMap(event => {
        const band$Array = event.bands.map(bandId => getBand(bandId));
        return forkJoin(band$Array).pipe(
          map(bandArray => ({bandArray, event}))
        );
    })
)

此转换返回的 Observable 发出一个具有 2 个属性的对象:bandArray保存使用getBand服务检索到的波段数组,event这是由 返回的 Observable 发出的对象getEvents

还要考虑到您正在使用switchMap,这意味着一旦由getEvents发射返回的 Observable您将切换到最后一个发射并完成当前可能正在进行的任何事情。换句话说,如果执行 所需的forkJoin时间比一个发射和另一个发射所需的时间长,您可以丢失一些事件getEvents

如果您不想丢失任何东西,那么最好使用mergeMap而不是switchMap.

更新的答案 - Band Observable 未完成

在这种情况下,我理解getBand(bandId)返回一个 Observable,它在第一次查询后端时首先发出,然后在后端中的带数据更改时发出。如果这是真的,那么你可以考虑这样的事情

getEvents().pipe(
    switchMap(event => {
        return from(event.bands).pipe(
           switchMap(bandId => getBand(bandId)).pipe(
              map(bandData => ({event, bandData}))
           )
        );
    })
)

这种转换产生一个 Observable,它在任何新事件发生时或在带区数据发生变化时发出。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当孩子被移除时淘汰掉可观察的父母

来自分类Dev

结合父母名单和孩子名单

来自分类Dev

结合使用RxTextView可观察和可改进观察

来自分类Dev

我如何使用班级的父母和孩子?

来自分类Dev

如何从位置获取父母和孩子的ID

来自分类常见问题

结合ActivatedRoute可观察变量和API请求中的可观察变量

来自分类Dev

结合ActivatedRoute可观察变量和API请求中的可观察变量

来自分类Dev

我如何结合三个可观察物

来自分类Dev

循环结合可观察物

来自分类Dev

RxJS结合可观察物

来自分类Dev

RxJS结合可观察物

来自分类Dev

如何在RxJS中处理循环依赖的可观察变量?

来自分类Dev

如何在父母和孩子之间共享过滤器

来自分类Dev

如何将父母和孩子加入Elasticsearch

来自分类Dev

如何为父母和孩子创建面包屑?

来自分类Dev

如何在父母和孩子之间共享过滤器

来自分类Dev

你如何在laravel eloquent中查询孩子和父母

来自分类Dev

你如何在laravel eloquent中查询孩子和父母

来自分类Dev

父母和孩子的订单查询

来自分类Dev

如何使输入可观察?

来自分类Dev

如何暂停可观察的

来自分类Dev

结合可观察的最新事物

来自分类Dev

响应式UI结合可观察对象

来自分类Dev

结合RxJava中的多个可观察对象

来自分类Dev

如何从孩子向父母的父母发送数据

来自分类Dev

如何使用jQuery使孩子成为父母的父母?

来自分类Dev

Caliburn.micro 父母->孩子和孩子->父母互动

来自分类Dev

如何获得父母元素的孩子?

来自分类Dev

如何使孩子的跨度与父母崩溃