如何使用RxJS创建队列

如何使用RxJS创建队列,rxjs,queue,observable,rxjs6,Rxjs,Queue,Observable,Rxjs6,我试图弄清楚queueScheduler在rxjs(版本6.2.2)中是如何工作的。 我正在运行一个express服务器,我想做的是接受多个请求,但是函数processMetricRequest2一次只能处理一个项目,但是下面的代码……当我连续两次访问/test1时,它将调用processMetricRequest2,即使它还没有完成(使用webMetrics功能需要几秒钟)。 你知道我做错了什么吗?谢谢 router.get('/test1', function(req, res, next)

我试图弄清楚queueScheduler在rxjs(版本6.2.2)中是如何工作的。 我正在运行一个express服务器,我想做的是接受多个请求,但是函数
processMetricRequest2
一次只能处理一个项目,但是下面的代码……当我连续两次访问
/test1
时,它将调用
processMetricRequest2
,即使它还没有完成(使用
webMetrics
功能需要几秒钟)。 你知道我做错了什么吗?谢谢

router.get('/test1', function(req, res, next) {
  let fn = partial(processMetricRequest2, req.query.input);
  queueScheduler.schedule(fn);
  res.render('index', { id: 1, current: {url: req.query.input}});
});
async function processMetricRequest2(url, arg) {
  console.log('--processing:', url);
  let result = await webMetrics(url);
  console.log('--FINISHED: ', url);
  return result;
}

您可能需要一个队列并连续处理请求。这可以使用带有处理功能的
Subject
concatMap
来完成。
queueScheduler
具有完全不同的含义

const { Subject } = require('rxjs');
const { concatMap } = require('rxjs/operators');

const queue = new Subject();

router.get('/test1', function(req, res, next) {
  queue.next(req.query.input);
  res.render('index', { id: 1, current: {url: req.query.input}});
});

async function processMetricRequest2(url) {
  console.log('--processing:', url);
  let result = await webMetrics(url);
  console.log('--FINISHED: ', url);
  return result;
}

queue
  .pipe(concatMap(processMetricRequest2))
  .subscribe();

此外,如果出现错误,队列将停止!订阅将终止。因此,您应该确保在
processMetricRequest2

中处理错误
queueScheduler
是为以广度优先的方式在组合观测中调度同步任务而设计的。它不是为调度异步任务而设计的尽管
await/async
部分会使它同步。不,
await/async
是承诺之上的语法糖分。你不能使它异步同步。