如何使用RxJS创建队列

时间:2018-08-15 21:28:14

标签: rxjs queue observable rxjs6

我正在尝试弄清queueScheduler在rxjs(版本6.2.2)中如何工作。 我正在运行快递服务器,我想做的是接受多个请求,但是功能processMetricRequest2一次只能处理一个项目,但是下面的代码...当我访问/test1时连续两次,即使尚未完成,它也会调用processMetricRequest2webMetrics函数需要几秒钟)。 关于我在做什么错的任何想法吗?谢谢!

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;
}

1 个答案:

答案 0 :(得分:1)

您可能想要一个队列并顺序处理请求。可以使用带有过程功能的SubjectconcatMap来完成。 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

中的错误
相关问题