如何构造一个以某个预定间隔发射的观测值,但也可以在第二个可观测值发射时发射,此时间隔将被重置"从第二次ping的开始以原始间隔再次开始发光?
例如,让我们说间隔是10分钟。观察者将在10,20,30等发射。但是让我们说第二个观察者在时间15发射。然后整体观察应该在10,15,25,35等处发声。
答案 0 :(得分:10)
在 angular 4 中,我设法使用以下
重置间隔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
}
答案 1 :(得分:7)
您可以switchMap
第二个流下的第一个流。
//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
触发时会重置。
答案 2 :(得分:1)
这是我的尝试。它做你想要的,但它不是特别优雅。
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);
初始observable包含一个使用switchMap
启动间隔的值。复位器observable是连接的,因此每次发出时间间隔都会被重置。 index
运算符提供的switchMap
参数用于确定是否发出间隔的初始值。 (如果您不关心发出的增量数字,可以删除map
- 它仅用于确保将发射数重置为零等。)
输出应为:
1.0: 0
1.5: 0
2.5: 1
3.5: 2
4.5: 3
5.5: 4
...