首页 > 解决方案 > RXJS:将多个端点调用的结果组合成一个数组

问题描述

我有一个与此类似的 RXJS 管道:

const logs: number[] = [1, 2, 3, 4];
const url = 'http://some-url-here.com';

const pipeline = from(logs).pipe(
  switchMap(logId =>
    this.callEndpoint(url, logId).pipe(map(response => response.data)),
  ),
);

const res = await pipeline.toPromise();
console.log(res);



// The real function uses nestJS http service to call a url
callEndpoint(url: string, logId: number) {
  const result = Math.random() * 1000;
  console.log(`result in callEndpoint: ${result}`);
  return of({ data: result });
}

这是代码的示例输出:

result in callEndpoint: 586.773956063481
result in callEndpoint: 842.136341622411
result in callEndpoint: 964.0849490798163
result in callEndpoint: 598.7596176858414
598.7596176858414

最后一个数字是 的结果res

如何将所有成功端点调用的组合结果放入单个数组中res

标签: typescriptrxjsnestjs

解决方案


如果forkJoin您想一次发送所有请求或concattoArray顺序发送请求并将结果收集到一个数组中,请使用此选项。您可能希望添加错误处理catchError并返回在这种情况下不会出错的可观察对象。

const getData = (logId) => this.callEndpoint(url, logId).pipe(
  map(response => response.data),
  catchError(error => of(null))
)
const requests = logs.map(logId => getData(logId));

// parallel requests
forkJoin(requests).subscribe(res => console.log(res));

// sequential requests
concat(...requests).pipe(toArray()).subscribe(res => console.log(res));

resnull如果请求失败,将是一个可以包含值的数组。当第二个请求失败时,这可能如下所示:

[586.773956063481, null, 964.0849490798163, 598.7596176858414]

推荐阅读