首页 > 解决方案 > rxjs - 过滤后组合内部可观察对象

问题描述

我调用后端响应:

[
  "https://some-url.com/someData1.json",
  "https://some-url.com/someData2.json"
]

每个 JSON 可以有以下模式:

{
  "isValid": boolean,
  "data": string
}

我想获取包含所有数据的数组,将 isValid 设置为 true

backend.get(url)
    .pipe(
        mergeMap((urls: []) =>
            urls.map((url: string) =>
                backend.get(url)
                    .pipe(
                        filter(response => response.isValid),
                        map(response => response.data)
                    )
            )
        ),
        combineAll()
    )

当两个 .json 都将“isValid”设置为 true 时,我会得到包含两个数据的数组。但是,当其中一个将“isValid”设置为 false 时,可观察到的永远不会完成。

我可以使用 mergeAll 而不是 combineAll,但随后我收到单个数据流而不是所有数据的集合。

有没有更好的方法来过滤掉可观察的?

标签: rxjsrxjs6

解决方案


正如您所说,内部可观察对象永远不会发出,因为filter不会转发可观察对象发出的唯一值backend.get。在这种情况下,订阅该 observable 的操作员 - 在您的情况下combineAll- 也将永远不会收到任何值,也永远不会发出自己。

我要做的只是combineAll通过提供一个项目功能来移动过滤和映射,如下所示:

backend.get(url)
    .pipe(
        mergeMap((urls: string[]) =>
            urls.map((url: string) => backend.get(url))
        ),
        combineAll(responses =>
            responses
                .filter(response => response.isValid)
                .map(response => response.data)
        )
    )

看看这是否适合你;)


推荐阅读