Reputation: 12025
I use the following code for timer:
export class TimerService {
private ticks: number = 0;
private seconds: number = 0;
private timer;
constructor(seconds: number) {
this.seconds = seconds;
this.timer = Observable.timer(2000, 1000);
this.timer.subscribe(t => {
this.ticks = t;
this.disactivate();
});
}
private disactivate() {
if (this.ticks === this.seconds) {
this.timer.dispose();
}
}
}
When I try to stop timer in line:
this.timer.dispose(); // this.timer.unsubscribe();
It does not work for me
Upvotes: 10
Views: 22628
Reputation: 341
I have not yet worked with the timer yet but I think the concept still works. The approach I used was working with a service.
(the work is based on: https://medium.com/angular-in-depth/the-best-way-to-unsubscribe-rxjs-observable-in-the-angular-applications-d8f9aa42f6a0)
new BehaviorSubject<T>(T)
.new Subscription()
object.addSubscription
method.ngOnDestroy(): void
unsubscribeService
private organisation = new BehaviorSubject<__Organisation>(newOrganisation);
organisation$ = this.organisation.asObservable();
private organisationSubscription: Subscription = new Subscription();
Service Methods
addOrganisationSubscription(subscription: Subscription): void {
this.organisationSubscription.add(subscription);
}
unSubscribeOrganisation(): void {
this.organisationSubscription.unsubscribe();
}
addOrganisationSubscription(subscription: Subscription): void {
this.organisationSubscription.add(subscription);
}
Component
this.organisationService.addOrganisationSubscription(
this.organisationService.organisation$.subscribe(
...
)
)
ngOnDestroy(): void {
this.organisationService.unSubscribeOrganisation();
}
Upvotes: 0
Reputation: 3045
So after some PUNISHING research I've added my own npm library for this problem.
Improves previous answer by NOT having to add any extra convolution variables and ease of use.
Upvotes: -1
Reputation: 94
The best way is to unsubscribe when instance is destroyed.
ngOnDestroy() {
this.sub.unsubscribe();
}
Upvotes: 0
Reputation: 28464
The subscribe
method returns a Subscription
object, which you can later use to stop listening the stream contained by the observable to which you subscribed.
import { ISubscription } from 'rxjs/Subscription':
import { TimerObservable } from 'rxjs/observable/TimerObservable';
export class TimerService {
private ticks = 0;
private timer$: TimerObservable;
private $timer : ISubscription;
constructor(private seconds = 0) {
this.timer$ = TimerObservable.create(2000, 1000);//or you can use the constructor method
this.$timer = this.timer.subscribe(t => {
this.ticks = t;
this.disactivate();
});
}
private disactivate() {
if (this.ticks >= this.seconds) {
this.$timer.unsubscribe();
}
}
}
Its important to notice that unsubscribe
exist in rxjs (version 5 and up), before that, in rx (version lower than 5, a different package) the method was called dispose
Upvotes: 19