如何使用RxJS创建队列
我试图弄清楚queueScheduler在rxjs(版本6.2.2)中是如何工作的。 我正在运行一个express服务器,我想做的是接受多个请求,但是函数如何使用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)
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
是承诺之上的语法糖分。你不能使它异步同步。