RxJS并行队列与并发工作器和每个请求的处理

时间:2019-06-30 19:24:47

标签: javascript parallel-processing rxjs concurrent-queue

我在使用RxJS和处理请求数组的正确方法时遇到了麻烦。 假设我有大约50个请求的数组,如下所示:

let requestCounter = 0;
function makeRequest(timeToDelay) {
  return of('Request Complete!').pipe(delay(timeToDelay));
}

const requestArray = []
for(let i=0;i<25;i++){
  requestArray.push(makeRequest(3000)); //3 seconds request
  requestArray.push(makeRequest(1000)); //1 second request
}

我的目标是:

  • 并行启动请求
  • 只有5个可以同时运行
  • 请求完成后,数组中的下一个开始
  • 请求完成(成功或错误)后,我需要将变量'requestCounter'加1(requestCounter ++)
  • 队列中的最后一个请求完成后,我需要预订此事件并处理每个请求结果的结果数组

到目前为止,我最近去做的是遵循这篇文章中的回复:

RxJS parallel queue with concurrent workers?

问题是我发现RxJS,并且示例对我来说太复杂了,我找不到如何处理每个请求的计数器。

希望您能帮助我。 (对不起,英语不好,这不是我的母语)

编辑: 最终解决方案如下:

forkJoinConcurrent<T>(
    observables: Observable<T>[],
    concurrent: number
  ): Observable<T[]> {
    return from(observables).pipe(
      mergeMap((outerValue, outerIndex) => outerValue.pipe(
        tap(// my code ),
        last(),
        catchError(error => of(error)),
        map((innerValue, innerIndex) => ({index: outerIndex, value: innerValue})),
      ), concurrent),
      toArray(),
      map(a => (a.sort((l, r) => l.index - r.index).map(e => e.value))),
    );
  }

1 个答案:

答案 0 :(得分:0)

首先,您应该使用subject存储请求队列,并查看mergeMap运算符,您可以为最大并发性设置一个concurrency参数,以及一个{{1 }}变量以跟踪通话次数

https://www.learnrxjs.io/operators/transformation/mergemap.html

index