typescript - Angular 2 Restablecer Temporizador de Observable
Tengo un servicio donde tengo un método que se llama automáticamente cada 30 segundos. También tengo un botón que permitirá a un usuario reiniciar el temporizador, evitando que este método se llame durante otros 30 segundos. ¿Cómo puedo reiniciar mi temporizador para que este método no se llame dentro de esos 30 segundos si se hace clic en el botón?
COMPONENTE
constructor(private service: Service) {
this.service.initialize();
}
refreshTimer(): void {
this.service.refreshTimer();
}
SERVICIO
initialize(): void {
timer(0, 30000).subscribe(() => this.refresh());
}
refreshTimer(): void {
// Need help here
}
Como puedes ver, mi componente llama a initialize() desde su constructor, lo que inicializa el temporizador para ejecutar this.refresh() cada 30 segundos. La idea es que mi HTML llame a refreshTimer() en el componente, lo que finalmente llamará a refreshTimer() en el servicio para reiniciar el temporizador. ¿Cómo puedo hacer esto?
¡Gracias de antemano!
Respuesta #1
Usaría switchMap que cancela la suscripción del timer anterior y se suscribe al nuevo que empieza de nuevo.
private reset$ = new Subject();
initialize(): void {
this.reset$
.pipe(
startWith(void 0),
switchMap(() => timer(0, 30000)),
)
.subscribe(() => this.refresh());
}
refreshTimer(): void {
this.reset$.next(void 0);
}
El operador startWith es necesario para activar la creación del primer timer al suscribirse.
Respuesta #2
Deberías darte de baja y luego volver a suscribirte al observable del temporizador
t = timer(0, 30000);
sub: Subscription;
initialize(): void {
this.sub = this.t.subscribe(() => this.refresh());
}
refreshTimer(): void {
this.sub.unsubscribe();
this.initialize();
}
o puedes simplemente tener un método
t = timer(0, 30000);
sub: Subscription;
initTimer(): void {
this.sub && this.sub.unsubscribe();
this.sub = this.t.subscribe(() => this.refresh());
}
