2016-09-17 12 views
5

Önceden belirlenmiş bir aralıkta yayılan bir gözlenebilirliği nasıl yapılandırabilirim, fakat aynı zamanda bir ikinci gözlenebilir bir yaydığı zaman yaymak için de yapılabilir, bu noktada aralık tekrar tekrar yaymaya başlamak için "sıfırlanır". ikinci ping noktasından başlayan orijinal aralık? Örneğin, aralığın 10 dakika olduğunu varsayalım diyelim. Gözlemlenebilir, 10, 20, 30, vb. Yayacaktır. Fakat diyelim ki, 15'de gözle görülebilen ikinci gözlemlenebilir. Sonra, genel gözlemlenebilir, 10, 15, 25, 35, vs.'de ping yapmalıdır.Sıfırlanabilir Gözlemlenebilir.interval

cevap

1

İşte benim denemem. İstediğinizi yapar, ama özellikle zarif değildir.

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); 

ilk gözlenebilir switchMap kullanılarak aralığını başlar tekme tek bir değer içerir. Gözlemlenebilen sıfırlayıcı birleştirildi, böylece aralık her saldığında sıfırlanır. switchMap operatörü tarafından sağlanan index parametresi, aralığın başlangıç ​​değerinin yayılıp yayılmayacağını belirlemek için kullanılır. (Eğer map kaldırabilir, duyulur artan sayılarla umurumda değil ise - sadece sıfırlanır yayan numaralarını olunması için kullanılmadan, vb)

çıkışı olmalıdır:

1.0: 0 
1.5: 0 
2.5: 1 
3.5: 2 
4.5: 3 
5.5: 4 
... 
5

switchMap saniyenin ilk akışı.

//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)); 

yukarıdaki sonucu her on dakikada yayar ama ne zaman dış Observable yangınları sıfırlamak alır bir Observable olurdu.

3

açısal yılında 4 aşağıdaki

private ngUnSubscribe: Subject<void> = new Subject<void>(); 

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

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

startIntervale() { 
    this.pillar_timer_interval 
    .takeUntil(this.ngUnSubscribe) 
    .subscribe((value) => { 
     //whatever function you calling every 3.5s 
    }); 
} 
resetInterval() { 
    this.ngUnSubscribe.next(); 
    this.startInterval(); 
} 
ile Aralığı sıfırlamak için yönetilen