Búsqueda de sitios web

angular - Cómo detener un intervalo después de iniciar en rxjs


Código escrito en el componente Angular para obtener los datos del servicio cada 10 segundos en ngOnInit, ahora quiero detener el intervalo que se ejecuta cada 10 segundos después de cierto tiempo como 5 minutos o cuando se haya recopilado la información.

Código del componente.

Getrecords() {
  Interval(10000).pipe(
    startWith(0),
    switchMap(() => this.getservice.getdata())
  ).subscribe(data => {
    this.code = data
  });
} 

Respuesta #1

En mi opinión, rxjs timer se adaptaría mejor a este escenario de la siguiente manera:

const source = timer(0,10000);
source
.pipe(take(6*5),//take till 5 mins i.e. 30 times
takeWhile(()=>a==b))//your condition
.subscribe()

Respuesta #2

necesitas darte de baja del observable.

private intervalSub: Subscription;

Getrecords() {
  this.intervalSub = Interval(10000).pipe(
    startWith(0),
    switchMap(() => this.getservice.getdata())
  ).subscribe(data => { this.code = data });
}

cancelInterval() {
  if (this.intervalSub)
    this.intervalSub.unsubscribe();
}

puedes llamar a esta función de cancelación manualmente después de cierto punto, o en el hook on destroy (asegúrate de que el componente implemente OnDestroy):

ngOnDestroy() {
  this.cancelInterval();
}

hay otras maneras de cancelar un observable, como agregar un operador que lo complete, como take(20) si solo quisieras 20 observaciones, o podrías usar el pipe async para que Angular lo maneje automáticamente, pero este es un método seguro.