Задать вопрос
@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 нужно сразу же слать запрос. Может кто знает как такое сделать?
  • Вопрос задан
  • 487 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Javascript.ru
    Курс по Angular
    6 недель
    Далее
  • Skillfactory
    Профессия Frontend-разработчик PRO
    14 месяцев
    Далее
  • Компьютерная академия «TOP»
    Frontend разработка
    12 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 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$)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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