首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重置Observable.interval

如何重置Observable.interval
EN

Stack Overflow用户
提问于 2016-09-17 11:58:06
回答 3查看 9.7K关注 0票数 13

我如何构造一个以预定间隔发射的可观测对象,但也可以使其在第二个可观测对象发射时发射,此时间隔将被“重置”,以从第二个ping的点开始以原始间隔再次发射?

例如,假设间隔为10分钟。可观测点将在10,20,30等处发射,但假设第二个可观测点在时间15处发射,那么总体可观测点应在10,15,25,35等处ping。

EN

回答 3

Stack Overflow用户

发布于 2017-10-13 16:54:50

angular 4中,我成功地用以下命令重置了间隔

代码语言:javascript
复制
private ngUnSubscribe: Subject<void> = new Subject<void>();

ngOnDestroy() {
      this.ngUnSubscribe.next();
      this.ngUnSubscribe.complete();
}

ngOnInit() {
   this.pillar_timer_interval =  IntervalObservable.create(3500);
   this.startInterval();
}

startInterval() {
  this.pillar_timer_interval
    .takeUntil(this.ngUnSubscribe)
    .subscribe( ( value ) => {
      //whatever function you calling every 3.5s
    });
}
resetInterval() {
  this.ngUnSubscribe.next();
  this.startInterval(); // start the interval again
}
票数 11
EN

Stack Overflow用户

发布于 2016-09-17 15:37:13

你可以在第二个流下switchMap第一个流。

代码语言:javascript
复制
//Outer timer fires once initially and then every 15 minutes
Rx.Observable.timer(0, 15 * 60 * 1000 /*15 minutes*/)
  //Each outer event cancels the previous inner one and starts a new one
  .switchMap(outer => Rx.Observable.interval(10 * 60 * 1000 /*10 minutes*/))
  .subscribe(x => console.log(x));

上面的结果将是一个每十分钟发出一次的Observable,但在外部Observable触发时会被重置。

票数 8
EN

Stack Overflow用户

发布于 2016-09-17 15:27:09

这是我的尝试。它可以做你想做的事情,但它并不是特别优雅。

代码语言:javascript
复制
import * as Rx from "rxjs/Rx";

const resetter = new Rx.Subject();

const resettableInterval = Rx.Observable.of(0)
    .concat(resetter)
    .switchMap((value, index) => {

        let interval = Rx.Observable.interval(1000);
        if (index > 0) {
            interval = Rx.Observable.of(-1).concat(interval).map((value) => value + 1);
        }
        return interval;
    });

const since = Date.now();
resettableInterval.subscribe(
    (value) => { console.log(`${((Date.now() - since) / 1000).toFixed(1)}: ${value}`); }
);
setTimeout(() => { resetter.next(0); }, 1500);

初始观察值包含一个值,该值使用switchMap启动时间间隔。重置器的观察值是串联的,所以每次它发出间隔都会被重置。switchMap运算符提供的index参数用于确定是否发出该间隔的初始值。(如果您不关心发射的增量数字,则可以删除map -它只用于确保发射数字被重置为零,等等。)

输出应为:

代码语言:javascript
复制
1.0: 0
1.5: 0
2.5: 1
3.5: 2
4.5: 3
5.5: 4
...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39542708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档