RxJS - 在区间

时间:2017-07-20 00:35:56

标签: node.js rxjs rxjs5

使用RxJS处理调度程序,每秒检查作业数组。作业完成后,将从阵列中删除。我想用 .mergeAll(并发)参数运行它,例如,只有两个作业同时运行。 目前我有一个可以看到的解决方法here

我正在尝试的是

Observable
  .interval(1000)
  .timeInterval()
  .merge(...jobProcesses.map(job => Observable.fromPromise(startJob(job.id))))
  .mergeAll(config.concurrency || 10)
  .subscribe();

这显然不起作用。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

从评论中看来,你似乎只是试图限制并发性,而这种间隔的东西只是绕道而行。你应该能够得到你需要的东西:

const Rx = require('rxjs/Rx')

let startTime = 0
const time = () => {
    if (!startTime)
        startTime = new Date().getTime()
    return Math.round((new Date().getTime() - startTime) / 1000)
}

const jobs = new Rx.Subject() // You may additionally rate-limit this with bufferTime(x).concatAll()
const startJob = j => Rx.Observable.of(undefined).delay(j * 1000).map(() => time())
const concurrency = 2

time()
jobs
    .bufferCount(concurrency)
    .concatMap(buf => Rx.Observable.from(buf).flatMap(startJob))
    .subscribe(x => console.log(x))

Rx.Observable.from([3, 1, 3]).subscribe(jobs)

// The last job is only processed after the first two are completed, so you see:
// 1
// 3
// 6

请注意,这在技术上并没有挤出最大可能的并发数,因为它会将作业分成不变的批次。如果您的作业处理时间非常不均匀,则批处理中最长的作业将延迟从下一批处理中拉出作业。