2017-10-05 2 views
0

Ich habe gerade über alles, was ich finden kann, versucht und kann nicht scheinen, dieses Intervall zu bekommen, um den Code innerhalb des Abonnements zu tun. Benutze ich das Intervall falsch?Kann nicht aufhören Observable Intervall

var subject = new Subject(); 
var interval = Observable.interval(this.settings.timing * 1000); 
var subscription = interval 
    .takeUntil(subject) 
    .subscribe(t => { 
    console.log('pushing new item'); 
    this.activeItems[0].contentLeaving = true; 
    setTimeout(()=>{ 
    this.activeItems[0].imageLeaving = true; 
    setTimeout(()=>{ 
     this.activeItems.push(this.activeItems.shift()); 
     setTimeout(()=>{ 
     this.activeItems[1].contentLeaving = false; 
     this.activeItems[1].imageLeaving = false; 
     },510); 
    },510); 
    },510); 
}); 
this.moduleProps.intervals.push(subject); 

In meinem ngOnDestroy

this.moduleProps.intervals.forEach((i)=>{ 
    i.complete(); 
}); 

Aber nachdem dies passiert Ich sehe immer noch die Aussage Konsolprotokoll sagen „neues Element drückt“, als ob es auf meinem Intervall läuft noch ist.

+0

Sie können auch anrufen 'subscription.unsubcscribe()' 'innen subscribe()'. Oder vielleicht verstehe ich nicht, was Sie tun wollen ... – martin

Antwort

0

Gemäß dieser Dokumentation (https://www.learnrxjs.io/operators/filtering/takeuntil.html), emittiert TakeUntil, bis das bereitgestellte Observable emittiert. Sie vervollständigen das Observable, ohne etwas zu emittieren. Versuchen Sie, .next() zu Ihrer onDestroy-Methode hinzuzufügen.

this.moduleProps.intervals.forEach((i)=>{ 
    i.next(); // have subject emit 
    i.complete(); 
}); 

Hier ist eine Arbeits zupfen (https://plnkr.co/edit/Zdf8C9d8vHk84uIMYHvH?p=preview)

+0

Ich habe das auch versucht, habe auch '.next()' etwas zurückgeben und das Intervall läuft weiter. – Jordan

+1

@ Jordan, können Sie nur Ihre Intervall-Abonnement (s) speichern, dann in Ihrem ngOnDestroy abmelden von denen, um das Intervall zu stoppen. Anstatt den takeUntil-Operator – LLai

+0

zu benutzen, habe ich das auch versucht, es funktioniert auch nicht. Interessanterweise, wenn ich '.next()' und 'coppelte()' sofort nachdem ich sie innerhalb eines Timeouts eingerichtet habe, zu verwenden, funktioniert alles perfekt. Es funktioniert nur nicht, wenn ich versuche, die Referenz später zu verwenden. – Jordan

0

Versuchen .takeWhile statt .takeUntil, kann es eine boolean verwenden.

private finished = false; // component property 

var interval = Observable.interval(this.settings.timing * 1000); 
var subscription = interval 
    .takeWhile(_ => this.finished) 
    .subscribe(t => { 
    ... 

OnDestroy ist dann einfach this.finished = true;

+0

takeWhile nimmt eine Funktion auf, die einen booleschen Wert zurückgeben soll, nicht nur einen booleschen – LLai

+0

In der Tat, Korrektur ... –