Задать вопрос
@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 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Академия Eduson
    Fullstack-разработчик на JavaScript
    11 месяцев
    Далее
  • Академия Eduson
    Frontend-разработчик
    9 месяцев
    Далее
  • Учебный центр IBS
    WEB-022 Разработка на Angular. Продвинутый уровень
    1 неделя
    Далее
Пригласить эксперта
Ответы на вопрос 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$)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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