RxJS如何随着时间的推移结合起来?

时间:2018-06-17 14:58:17

标签: typescript rxjs combinelatest

我试图创建一个轮询系统,以间隔方式轮询后端。

我有一个方法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的新手,因此无论是否与该主题相关,任何建议都会受到高度赞赏。

谢谢!

0 个答案:

没有答案