我试图创建一个轮询系统,以间隔方式轮询后端。
我有一个方法add
,它接受一个包含该命令作为字符串的pollingItem和该间隔的refreshTime,并将从该区间创建的observable传递给一个主题。
this.sideEffect
是传递给init的类构造函数的函数,它与后端进行通信。
我想创建两种类型的间隔:
当调用链接到IntervalMap中的命令的主题时,可以停止的默认值。
A' SWITCH'一个可以以与上面相同的方式停止,但也可以在添加新的pollingItem时停止。
add(pollingItem, type = 'DEFAULT') {
this.intervalMap = { ...this.intervalMap, [pollingItem.command]: new Subject() };
switch (type) {
case 'SWITCH': {
const poller = interval(pollingItem.refreshTime).pipe(
takeUntil(this.intervalMap[pollingItem.command]),
takeUntil(this.onAdd$),
tap(() => {
this.sideEffect(pollingItem.command);
})
);
this.poll$.next(poller);
break;
}
default: {
const poller = interval(pollingItem.refreshTime).pipe(
takeUntil(this.intervalMap[pollingItem.command]),
tap(() => {
this.sideEffect(pollingItem.command);
})
);
this.poll$.next(poller);
break;
}
}}
我的问题是,我希望能够将一段时间内传递给poll$
的观察者组合起来。
目前我试图通过这种方式实现这一目标:
initialize() {
this.poll$
.pipe(
takeUntil(this.clear$),
scan((agg, current) => {
return [...agg, current];
}, [])
)
.subscribe(
poll => {
combineLatest(poll)
.pipe(takeUntil(this.onComplete$))
.subscribe(() => {
this.onAdd$.next();
});
},
() => {},
() => {
this.onComplete$.next();
}
);}
然而,虽然这确实实现了随着时间的推移组合可观察量的目标,但它是有限的,因为它重新启动添加的所有间隔,这不是预期的行为。
我不知道从哪里开始。
有什么建议吗?我仍然是RxJS的新手,因此无论是否与该主题相关,任何建议都会受到高度赞赏。
谢谢!