首页 > 解决方案 > 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来保持序列,程序会一个一个地执行,我不在乎序列,我只想知道如何连接源和结果。

非常感谢~

标签: javascripttypescriptrxjs6

解决方案


用这种方式试试?

  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", _);
  });

推荐阅读