@Coder321

Как правильно доделать таймер через rxjs?

Есть примерно такой запрос
Observable.timer(0, 2000)
            .switchMap(() => Observable.if(
                () => this.isBlocked,
                Observable.defer(() => this.http.post(apiPath)
                )
            )
            .catch(err => Observable.empty())
            .subscribe((data: Array<any>) => {
                this.notise = this.mapData(data);
            });


который посылает запросы по таймеру но етсь одна проблемы, во первых когда переменная isBlocked === false запросы не идут, тут как бы норм, но интервал таймер продолжает работать. Как бы проблема не существенная но не очень приятная. Вторая проблема это то что после изменения isBlocked на true нужно сразу же слать запрос. Может кто знает как такое сделать?
  • Вопрос задан
  • 462 просмотра
Пригласить эксперта
Ответы на вопрос 1
@dmitrygavrish
Если вам не нужен бесконечный таймер, то проще будет от него отказаться. По поводу решения "после изменения isBlocked на true нужно сразу же слать запрос" - создайте свою последовательность, которую вы будете в нужный момент итерировать с нужным вам значением (код для примера):
class SomeComponent {
    private _isBlocked$$: Subject<boolean> = new Subject();
    public isBlocked$: Observable<boolean> = this._isBlocked$$.asObservable();

    public ngOnInit(): void {
        this.isBlocked$
            .switchMap((isBlocked: boolean) =>
                isBlocked ? this.http.post(apiPath) : Observable.of(null))
            .subscribe((data: Array<any>) => {
                if (data !== null) {
                    this.notise = this.mapData(data);
                }
            });
    }

    public someMethod(bool: boolean): void {
        this._isBlocked$$.next(bool);
    }
}


Если все-таки хотите оставить таймер и остановить в конкретный момент, то подойдет takeUntil:
Observable.timer(0, 2000).takeUntil(this.isBlocked$)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы