Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 队列使用RxJS发出值,就像使用p-Queue可以完成一样_Javascript_Promise_Rxjs_Queue_Observable - Fatal编程技术网

Javascript 队列使用RxJS发出值,就像使用p-Queue可以完成一样

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

使用,我可以限制在一段时间内启动某个异步操作(例如,API请求)的次数,以及一次可以运行多少个异步操作

它工作得很好,但我觉得我应该能够用它做同样的事情。我很难弄明白怎么做。我对RxJS还是相当陌生的,我还没有找到任何能够实现我所尝试的功能的示例

我看到像and这样的操作符,这些看起来像是要走的路,但是我很难把所有这些信息放在一起

如何复制以下各项的配置:

{
    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')
)