首页 > 解决方案 > 解析可观察对象数组并附加到最​​终数组中

问题描述

我有一个像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),
    ....
]

标签: rxjs

解决方案


如果您在进行所有这些查询之前知道长度——那么您可以根据需要创建任意数量的 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 示例以供参考。

希望这可以帮助


推荐阅读