Rxjs 解析观察值数组并追加到最终数组中

Rxjs 解析观察值数组并追加到最终数组中,rxjs,Rxjs,我有一个端点url,它返回一个字符串数组。 如果以这种方式调用此端点,服务器将挂起,因为字符串数组的长度非常大 我需要生成一个具有增量“开始”和“限制”参数的观察值数组,然后依次或并行地解析所有的观察值,然后得到最终的观察值,最终得到真正的字符串数组,通过合并内部观察值返回的所有字符串子数组得到 我该怎么做 i、 e.可观测的数组类似于 [ httpClient.get(http://site/api/myquery?start=0&limit=1000), httpCl

我有一个端点url,它返回一个字符串数组。 如果以这种方式调用此端点,服务器将挂起,因为字符串数组的长度非常大

我需要生成一个具有增量“开始”和“限制”参数的观察值数组,然后依次或并行地解析所有的观察值,然后得到最终的观察值,最终得到真正的字符串数组,通过合并内部观察值返回的所有字符串子数组得到

我该怎么做

i、 e.可观测的数组类似于

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

如果您不知道项目总数,可以使用

下面的文章很好地介绍了
expand
,并解释了如何使用它进行分页

在您的案例中,可以使用下面代码中的一些内容,对每个页面进行一系列的请求

const limit = 1000;
let currentStart = 0;

let getUrl = (start, limit) => `http://site/api/myquery?start=${start}&limit=${limit}`;

httpClient.get(getUrl(currentStart, limit)).pipe(
  expand(itemsArray => {
    if (itemsArray.length) {
      currentStart += limit;
      return httpClient.get(getUrl(currentStart, limit));
    }

    return empty();
  }),
  reduce((acc, value) => [...acc, ...value]),
).subscribe(itemsArray => { 
    console.log(itemsArray); 
})

一旦整个请求序列得到解决,这将注销最终的项目数组。

如果您在进行所有这些查询之前知道长度,那么您可以根据需要创建尽可能多的http get Observable,然后使用投影fn将它们连接起来

forkJoin
将允许您进行并行查询,然后合并这些查询的结果。举个例子:

从'rxjs'导入{forkJoin};
//鉴于我们知道长度:
常数长度=500;
//我们可以选择任意大小的页面
const PAGE_SIZE=50;
//计算请求数
const requestscont=Math.ceil(长度/50);
//生成计算的请求数
常量请求=(新数组(RequestScont))
.填写(空白0)
.map((u,i)=>{
const start=i*页面大小;
返回http.get(`http://site/api/myquery?start=${start}&limit=${PAGE_SIZE}`);
});
分叉连接(
请求,
//突出fn
//将所有数组合并为一个数组
//例如,次优合并
(…结果)=>results.reduce(((acc,curr)=>[…acc,…curr]),[])
).subscribe(数组=>{
console.log(数组);
})
请检查此项以供参考


希望这有帮助

在进行这些调用之前,您知道项目的总体限制吗?是的,我知道,我可以查询元数据以获得总计数(即我称之为“字符串数组”的长度)