javascript - 使用 Rxjs 并行调用同时延迟的请求 block ?

标签 javascript angular rxjs rxjs5

我有一个任务队列(长度为 20),其中每个任务都是一个要调用的 ajax 请求。

我想:

1) 创建 5 个 block ( 20/5 =4 个 block )
2) 执行每个 block ,其中每个 block 中的项目 将以 1000 毫秒的延迟执行。
3) 当每个 block 项目完成时,等待 3 秒。

所以:

1..1sec(↦绿)..2..1sec(↦绿)..3..1sec(↦绿)..4..1sec( ↦ green)..5......................3sec..........
6..1sec( ↦ 绿色)..7..1sec( ↦ 绿色)..8..1sec( ↦ 绿色)。 .9..1sec( ↦ 绿色)..10..3sec.. ………… ... 11..1sec( ↦ 绿色)..12..1sec( ↦ 绿色)..13..1sec( ↦ 绿色)。 .14..1sec( ↦ 绿色)..15........ 3sec.. .........
16..1sec( ↦ 绿色)..17..1sec( ↦ 绿色)..18..1sec( ↦ 绿色)。 .19..1sec( ↦ 绿色)..20

我确实设法做了一些接近的事情:

enter image description here

与:

from(this.httpCodes)
      .pipe(bufferCount(5),
       concatMap((i, y) => from(i).pipe(mergeMap(f => {
                                    this.httpCodes[f.index].wasExecuted = true;
                                     return this.ajaxAlike(f.data).pipe(
                                                               catchError(() => { return of(-1) }),
                                                               map((r) => ({ res: r, data: f }))
                                                                      )
                                                      }) 
                                        ,delay(3000) )),

      )

但它没有按照我的预期执行。我没有看到 block 中每个项目之间的延迟

问题:

为什么我看到这么多请求,以及如何更改我的代码,以便 block 中的每个项目将以 1 秒的延迟执行(绿色应该在每一秒后出现),并且 - 在每个 block 之后,等待3 秒?

Online Demo

最佳答案

delay 运算符延迟发出的项目。似乎您希望它发射该元素,然后在发射下一个元素之前“休眠” 3 秒。为此,您可以连接一个空的延迟可观察对象

您可以创建以下pipeable sleep 运算符:

const sleep = ms => concat(Rx.Observable.empty().pipe(delay(ms)))

并按如下方式使用它:

const {concatMap, concat, delay, bufferCount} = Rx.operators;

const sleep = ms => concat(Rx.Observable.empty().pipe(delay(ms)));

const ajaxAlike = call => Rx.Observable.of(call).pipe(delay(500));

Rx.Observable.range(0, 20).pipe(
  bufferCount(5),
  concatMap(calls => 
    Rx.Observable.from(calls).pipe(
      concatMap(call => ajaxAlike(call).pipe(sleep(1000))),
      sleep(3000)
    )
  )
)
.subscribe(console.log)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.7/Rx.js"></script>

关于javascript - 使用 Rxjs 并行调用同时延迟的请求 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49463542/

相关文章:

angular - 完成for循环后如何完成订阅者?

javascript - 可观察对象的条件合并

c# - 在前一个元素匹配条件后获取流的第一个元素

具有 4 级嵌套参数的 Angular 通用启动器预渲染

angular - 动态(点击)功能 - Angular2

angular - 能够禁用 primeNG 编辑器框

javascript - meteor 变量范围

javascript - iOS 中使用 javascript 预加载图像

javascript - js中十进制数的较大部分

javascript - Canvas 获取透视点