javascript - rxjs,如何合并多个请求,并行请求中的一个串行请求,得到一个结果
问题描述
例如,我有 2 个 API 服务,返回类型是 Observable。
function add(row) {
let r = Math.ceil(Math.random() * 2000);
let k = row + 1;
return timer(r).pipe(mapTo(k));
}
function mutiple(row) {
let r = Math.ceil(Math.random() * 2000);
let k = row * 10;
return timer(r).pipe(mapTo(k));
}
有一个数组[1, 2, 3, 4, 5]
,我使用以下两个函数:
from([1, 2, 3, 4, 5]).pipe(
mergeMap((row) => {
return add(row);
}),
mergeMap((row) => {
return mutiple(row);
}),
toArray()
).subscribe((_) => {
console.log("sub", _);
});
结果是
sub [ 50, 20, 60, 40, 30 ]
答案是我想要的。
但是,我不知道数组元素的来源,我希望结果是
[ [4, 50], [1, 20], [5, 60], [3, 40], [2, 30] ]
或者
[
{ sourceData: 4, result: 50 },
{ sourceData: 1, result: 20 },
...
]
如果我使用contactMap来保持序列,程序会一个一个地执行,我不在乎序列,我只想知道如何连接源和结果。
非常感谢~
解决方案
用这种方式试试?
from([1, 2, 3, 4, 5]).pipe(
mergeMap((row) => {
const index$ = of(row);
return forkJoin([index$, add(row)]);
}),
mergeMap(([index, row]) => {
return forkJoin([of(index), mutiple(row)]);
}),
toArray()
).subscribe((_) => {
console.log("sub", _);
});
或者
const handler = v => {
return of(v).pipe(
mergeMap((row) => {
return add(row);
}),
mergeMap((row) => {
return mutiple(row);
}),
)
}
from([1, 2, 3, 4, 5]).pipe(
mergeMap(row => forkJoin([of(row), handler(row)])),
toArray()
).subscribe((_) => {
console.log("sub", _);
});
推荐阅读
- c - 使用 free() 会破坏 C 中的 char 数组数据
- unit-testing - 如何测试 GenServer 重启行为?
- python - argparse 采用 int & string?
- terraform - 如何使 terraform 跳过破坏资源?
- c# - 如何处理异步方法抛出的混乱异常?
- rstudio - 安装 RSQLite 时如何修复“找不到‘blob’包”?
- git - Git合并所有剩余未合并路径的传入更改
- hive - Ambari集群重启报错:Timeline Service V2.0 Reader没有重启
- c++ - 从拉伸多边形生成 3D 网格
- vue.js - Vuejs 有效负载在突变中未定义。'无法设置未定义的属性'