rxjs - 解析可观察对象数组并附加到最终数组中
问题描述
我有一个像http://site/api/myquery?start=&limit=这样的端点 url ,它返回一个字符串数组。如果我以这种方式调用此端点,则服务器会挂起,因为字符串数组的长度很大。
我需要生成一个带有增量“start”和“limit”参数的可观察数组,然后依次或并行解析所有这些,然后得到一个最终的可观察对象,它最终产生真正的字符串数组,获得合并内部可观察对象返回的所有字符串子数组。
我该怎么做?
即可观察的数组将类似于
[
httpClient.get(http://site/api/myquery?start=0&limit=1000),
httpClient.get(http://site/api/myquery?start=1000&limit=1000),
httpClient.get(http://site/api/myquery?start=2000&limit=1000),
....
]
解决方案
如果您在进行所有这些查询之前知道长度——那么您可以根据需要创建任意数量的 http-get Observables,然后forkJoin
使用投影 fn 来创建它们。
forkJoin
将让您进行并行查询,然后合并这些查询的结果。这是一个例子:
import { forkJoin } from 'rxjs';
// given we know the length:
const LENGTH = 500;
// we can pick arbitrary page size
const PAGE_SIZE = 50;
// calculate requests count
const requestsCount = Math.ceil(LENGTH / 50);
// generate calculated number of requests
const requests = (new Array(requestsCount))
.fill(void 0)
.map((_,i) => {
const start = i * PAGE_SIZE;
return http.get(`http://site/api/myquery?start=${start}&limit=${PAGE_SIZE}`);
});
forkJoin(
requests,
// projecting fn
// merge all arrays into one
// suboptimal merging, just for example
(...results) => results.reduce(((acc, curr)=> [...acc, ...curr]) , [])
).subscribe(array => {
console.log(array);
})
检查此forkJoin 示例以供参考。
希望这可以帮助
推荐阅读
- math - 如何计算一簇单位向量的平均方向?
- python - 使用 pyspark 从字符中删除重音符号
- android - addToBackStack(String.valueOf(index))不起作用
- sequelize.js - 续集乐观锁定不起作用?
- angular - 基于条件的角度动态文本
- gitlab - 使用带有子模块的 Gitlab 的 CI/CD - 无法运行 ssh
- flutter - 当我使用 textformfield 的 onsave 方法进入另一个类时访问我的位置小部件的变量
- c# - 如何在 C# net5.0 中使用 with 关键字将一条记录复制到另一条记录
- java - 无法安装maven,系统无法识别“mvn”命令行
- reactjs - 如何使用 react state 将多个表单数据存储到 antd 表中?