是否有一个rxjs操作符来获取一个可观察的列表,并一次订阅N,直到全部完成?

是否有一个rxjs操作符来获取一个可观察的列表,并一次订阅N,直到全部完成?,rxjs,Rxjs,我的应用程序需要对一个API进行多个单独的数据调用,但出于性能原因,我不想一次将它们全部转储。是否有一个rxjs操作符允许我一次只运行几个,然后将它们的所有结果合并为一个 因此,如果我需要从ABC获得结果…XYZ,我只需要两个请求激活一次,它将订阅a和B。然后,如果B完成,它将订阅C。然后a完成,它订阅D。依此类推,直到全部完成,但只有两个订阅处于活动状态。是的,有一个选项可以这样做。merge的最后一个参数必须是(并发请求的)数量 文件摘录: const timer1=间隔(1000)。管道(

我的应用程序需要对一个API进行多个单独的数据调用,但出于性能原因,我不想一次将它们全部转储。是否有一个rxjs操作符允许我一次只运行几个,然后将它们的所有结果合并为一个

因此,如果我需要从ABC获得结果…XYZ,我只需要两个请求激活一次,它将订阅a和B。然后,如果B完成,它将订阅C。然后a完成,它订阅D。依此类推,直到全部完成,但只有两个订阅处于活动状态。

是的,有一个选项可以这样做。
merge
的最后一个参数必须是(并发请求的)数量

文件摘录:

const timer1=间隔(1000)。管道(取(10));
常数timer2=间隔(2000)。管道(取(6));
常数计时器3=间隔(500)。管道(取(10));
const concurrent=2;//争论
const merged=合并(timer1、timer2、timer3、并发);
merged.subscribe(x=>console.log(x));

我最接近的方法是将两个流的
concat
merge
结合起来,使它们并行运行。 也许有更好的方法可以做到这一点,但也许这可以成为你玩弄的起点:

import { delay, concatMap } from  'rxjs/operators';
import { of, concat, merge } from 'rxjs';

const reqA = of('a').pipe(delay(1000));
const reqB = of('b').pipe(delay(1000));
const reqC = of('c').pipe(delay(1000));
const reqX = of('x').pipe(delay(1000));
const reqY = of('y').pipe(delay(1000));
const reqZ = of('z').pipe(delay(1000));

const abc = [reqA, reqB, reqC];
const xyz = [reqX, reqY, reqZ];

merge(concat(...abc), concat(...xyz)).subscribe(
  console.log
);

因此,在一个可观察数组(您的流)上使用concat可以确保只有一个可观察数组正在运行,完成后,它将订阅数组中的下一个可观察数组。使用merge,您可以合并两个流
abc
xyz
,这意味着将有两个流同时处于活动状态


更新
我不知道merge操作符的
concurrent
参数,这也是应该做的。我不清楚这是否可能。不确定为什么他们没有明确提到它,这似乎是一个非常有用的功能。

这不限于6个输入观察值吗?实际上,这是正确的解决方案。接受并发参数以限制订阅的活动内部可观察对象的数量。6个源观测值的限制是因为只定义了6个TypeScript函数重载<代码>合并本身没有限制。因此,如果您想将它与更多参数一起使用,我认为您可以像
merge.apply([…])
那样使用它。或者另一种解决方案是使用
mergeAll(concurrency)
操作符。如果最后提供的参数是number,那么
merge
不会一直订阅。关于如何检查我给出的示例。而且,它的并发性仅为1;)关于
merge
的最后一个参数,请看一下。我也认为这是正确的解决方案
merge
在内部使用
mergeMap
,如果活动订阅的数量超过了
并发
限制,它会缓冲传入的值。当一个内在的obs。完成后,它将从缓冲区中获取最旧的值,并从中创建一个内部可观察对象。此合并的可观察对象应发出什么以及何时发出?如果您希望具有指定并发执行量选项的
forkJoin
类行为,请参阅: