typescript - 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
?
解决方案
如果forkJoin
您想一次发送所有请求或concat
按toArray
顺序发送请求并将结果收集到一个数组中,请使用此选项。您可能希望添加错误处理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));
res
null
如果请求失败,将是一个可以包含值的数组。当第二个请求失败时,这可能如下所示:
[586.773956063481, null, 964.0849490798163, 598.7596176858414]
推荐阅读
- linux - 内核 4.4.192 自旋锁已解锁
- sap-cloud-sdk - SAP JAVA VDM 在输入中拆分 $filter
- javascript - 在 Vue 上处理 Laravel 链接
- database - 是否可以复制 Cassandra 中的两个键空间?
- python - 如何创建扩展公式的函数?
- macos - Mac OS X - 获取系统上运行的所有进程的列表?
- vue.js - 如何在 vue.js 中使用 options 参数自定义插件?
- arduino - 从 arduino 的串行电车获取 INT
- javascript - 从具有相同突变的另一个方法调用方法
- javascript - 星火AR v98 | JavaScript 错误:意外的场景对象引用