typescript - Hur man dynamiskt ändrar perioden/fördröjningen för ett intervall för Angular/RxJS


Jag vill dynamiskt ändra perioden/fördröjningen för ett intervall, men tyvärr är jag inte så bekant med Angular, så jag sitter fast vid den här delen.

Här är min nuvarande kod:

timeDiffs : number[] = [] <== this is a preprocessed array with the timemeasurements in milliseconds

this.interval$ = interval(this.timeDiffs[this.intervalCounter++]).subscribe(() => {
    //some function calling here
     this.intervalCounter++; // next index for next iteration with a different time
})

Svar #1

Du borde kunna göra detta med bara concatMap() och timer(). concatMap() garanterar att fördröjningarna körs i korrekt ordning endast när den föregående har slutförts. timer() avger en gång och slutförs efter inställd fördröjning.

import { from, concatMap, timer } from 'rxjs';

const timeDiffs = [1000, 1000, 3000, 1000];

from(timeDiffs)
  .pipe(
    concatMap(delay => timer(delay)),
  )
  .subscribe(console.log)

Demo: https://stackblitz.com/edit/rxjs-nqyxqk?devtoolsheight=60&file=index.ts

Svar #2

Använd BehaviorSubject

const variable$ = new BehaviorSubject(1); //you can set initial value as per your need


this.variable$.pipe(
  switchMap(val => interval(125 * val),
  //now apply your various operators chain as per your need
  takeWhile(),...
  tap(),...
  map()...
).subscribe();

 this.variable$.next(newValue); //you can use this line to change variable  with a new value