Javascript 队列使用RxJS发出值,就像使用p-Queue可以完成一样
使用,我可以限制在一段时间内启动某个异步操作(例如,API请求)的次数,以及一次可以运行多少个异步操作 它工作得很好,但我觉得我应该能够用它做同样的事情。我很难弄明白怎么做。我对RxJS还是相当陌生的,我还没有找到任何能够实现我所尝试的功能的示例 我看到像and这样的操作符,这些看起来像是要走的路,但是我很难把所有这些信息放在一起 如何复制以下各项的配置:Javascript 队列使用RxJS发出值,就像使用p-Queue可以完成一样,javascript,promise,rxjs,queue,observable,Javascript,Promise,Rxjs,Queue,Observable,使用,我可以限制在一段时间内启动某个异步操作(例如,API请求)的次数,以及一次可以运行多少个异步操作 它工作得很好,但我觉得我应该能够用它做同样的事情。我很难弄明白怎么做。我对RxJS还是相当陌生的,我还没有找到任何能够实现我所尝试的功能的示例 我看到像and这样的操作符,这些看起来像是要走的路,但是我很难把所有这些信息放在一起 如何复制以下各项的配置: { concurrency: 2 /* at a time */ , intervalCap: 10 /* per e
{
concurrency: 2 /* at a time */
, intervalCap: 10 /* per every… */
, interval: ( 15 /* seconds */ * 1000 /* milliseconds */)
, carryoverConcurrencyCount: true
}
…使用
RxJS解决方案应:
- 队列为空时立即允许通过值(即立即开始新的间隔,而不是等待某个间隔,其时间取决于队列上次不为空的时间)
- 提供与“结转并发计数”相同的功能:“…任务必须在给定的间隔内完成,或将结转到下一个间隔计数。”
完整示例使用:
我不知道p-queue,但您可能可以查看
mergeMap
操作符来完成您想要的操作,尤其是mergeMap
的并发性
参数。通过concurrency
参数,您可以定义可以并发运行的并行执行数量
因此,从您的示例开始,代码可以是这样的
const concurrency = 1;
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min)) + min; //The maximum is exclusive and the minimum is inclusive
}
const queuePromises = (
[...(Array(20)).keys()]
.map(number => new Promise(
(resolve, reject) => setTimeout(() => resolve(number), getRandomInt(0, /* up to */ 250) /* milliseconds */)))
) ;
from(queuePromises).pipe(
mergeMap(qp => from(qp), concurrency)
)
.subscribe(
number => console.log(number, 'resolved')
, error => console.error('Individual Promise error', error),
() => console.log('all are resolved')
)
将
concurrency
的值设置为1可以让您看到承诺的结果实际上是按顺序到达的。谢谢!它让我朝着正确的方向前进mergeMap
似乎是的别名,对吗?并发性为1
的mergeMap
是否与相同?我用concurrency=1
和concurrency=2
运行了您的代码一次,可以看出其中的区别。对您的问题都是肯定的mergeMap
是flatMap
的新名称concatMap
是mergeMap
,并发设置为1。
const concurrency = 1;
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min)) + min; //The maximum is exclusive and the minimum is inclusive
}
const queuePromises = (
[...(Array(20)).keys()]
.map(number => new Promise(
(resolve, reject) => setTimeout(() => resolve(number), getRandomInt(0, /* up to */ 250) /* milliseconds */)))
) ;
from(queuePromises).pipe(
mergeMap(qp => from(qp), concurrency)
)
.subscribe(
number => console.log(number, 'resolved')
, error => console.error('Individual Promise error', error),
() => console.log('all are resolved')
)