RxJS:如何设置exhaustMap并发?

RxJS:如何设置exhaustMap并发?,rxjs,Rxjs,我们可以在mergeMap上使用concurrent,但我认为这会导致累积。 我可以为排气图设置并发吗 interval(500).pipe( mergeMap(timer(3000), 3) ) 所以我找到了一个相当简单的方法来实现我认为你在寻找的东西。在本例中,我使用了一个toggle变量,但您当然可以使用任何布尔生成器: toggle=true; 并发=5; 间隔(500)。管道( 筛选器(()=>this.toggle),//我们仍然接受值吗? 合并映射((val,索引)=>{ /

我们可以在mergeMap上使用concurrent,但我认为这会导致累积。 我可以为排气图设置并发吗

interval(500).pipe(
  mergeMap(timer(3000), 3)
)

所以我找到了一个相当简单的方法来实现我认为你在寻找的东西。在本例中,我使用了一个
toggle
变量,但您当然可以使用任何布尔生成器:

toggle=true;
并发=5;
间隔(500)。管道(
筛选器(()=>this.toggle),//我们仍然接受值吗?
合并映射((val,索引)=>{
//当我们达到并发限制时,停止接受值
if(索引%this.concurrent==0&&index!==0){
this.toggle=false;
}
//我添加了一个比例延迟,以显示值被忽略
返回(val).管道(延迟(500*val));
}),
合并映射((val,索引)=>{
//一旦预设数量的值通过管道,
//意味着我们的地图是完整的,
//再次开始接受值
if(索引%this.concurrent==0&&index!==0){
this.toggle=true;
}
返回(val);
}),
点击(console.log)
).subscribe();

当然,这只是一个概念的演示。它看起来像你要找的吗?

你可以自己创建这样一个操作符。下面是一个可能的实现:

const{interval,timer,of,empty}=rxjs
const{mergeMap,map,tap,filter}=rxjs.operators
const exhaustMapWithConcurrency=
(选择器,并发=1)=>
来源=>{
设active=0;
返回源管道(
筛选器(=>活动<并发),
轻触(=>active++),
合并映射(选择器),
轻触(=>活动--)
)
}
间隔(500)。管道(
exhaustMapWithConcurrency(x=>
计时器(3000)。管道(
映射(=>x)
), 3)
)
.subscribe(console.log)

您想实现什么?我想实现exhaustmap的并发。exhaustmap忽略值直到完成。我想忽略一些值,并确保同时执行多个exhaustmap。我认为,您可以将第一个
mergeMap
替换为
filter
。此外,需要注意存储状态的运算符:我认为如果有多个订阅者,答案的实现将有问题。