如何从多个请求中累积数据

时间:2019-01-11 12:41:40

标签: typescript rxjs nestjs

我有一个创建许多请求的服务功能:

getData(): Array<Observable<AxiosResponse<Data>>> {
    const data = [];
    for (let i = 1; i <= end; i++) {
      data.push(
        this.http.get<Data>(
          getUrl(i),
        ),
      );
    }
    return data;
  }

我具有控制器功能:

@Get()
get() {
    return this.appService.getData().forEach(x => {
      x.subscribe(y => {
        // need to accumulate the data from each request and return that as a single json
      });
    });
  }

您将如何在控制器方法中累积每个请求的所有数据 并将其作为单个json返回?有什么想法吗?

如果我这样做:

  @Get()
  get() {
    const data = [];
    return this.appService.getData().forEach(x => {
      x.subscribe(y => {
        data.push(...y.data);
      });
      return data;
    });
  }

无法使用,因为return data将在实际的.subscribe(...)之前执行

y.data是一个对象数组,例如:

[
 {key:"xyz", value:123 },
 {key:"abc", value:666 }
]

1 个答案:

答案 0 :(得分:2)

您可以使用rxjs运算符更好地处理它。

import { Observable, range } from 'rxjs';
import { concatMap, toArray } from 'rxjs/operators';

const source: Observable<Data[]> = range(1, end)
  .pipe(
    concatMap((i: number) => this.http.get<Data>(getUrl(i))),
    toArray()
  );

然后您可以订阅此来源:

source.subscribe((data: Data[]) => {
  // Do some stuff with data
});