@Programep

Как сделать паузу и запуск intrerval в RxJS?

Добрый день!
Подскажите, пожалуйста, как решить такую задачу. Также просьба посоветуйте руководства по RxJS с простыми примерами.
  1. Проект разрабатываю на Angular 7.0.4 и rxjs 6.3.3
  2. на странице есть две подписки на два interval.
    1-й: interval(10000); внутри subscribe этого interval отрабатывают http-запросы.
    2-й: interval(1000); этот интервал изменяет переменную second_to_event на -1. При выполнении условия second_to_event == 0, нужно:
    1. приостановить эту подписку
    2. выполнить http-запрос
    3. в случае успешного выполнения http-запрос, сбросить переменную second_to_event, запустить подписку


Через google нашел, что для этого используют switchMap: вот пример. Но в этом примере Observable создается на событие, а в моем случае, как я понимаю, нужно сделать Observable на условие.
Вот код, который у меня сейчас есть:
export class GameComponent implements OnInit, OnDestroy {

  reloadGameInfo = interval(10000);
  reloadGameInfoSubscription: Subscription;
  stepTimer = interval(1000);
  stepTimerSubscription: Subscription;
  
  ngOnInit(){
	  this.reloadGameInfoSubscription = this.reloadGameInfo.subscribe(() => {      
      this.gameService.getInfoGame(this.current_game.auth_key)
        .subscribe((response: Game) => {          
          if (this.current_game.status_id == gameStatusCode.two_player_in_game) {            
            if (!this.stepTimerSubscription) {
              this.stepTimerSubscription = this.stepTimer.subscribe(() => {                                
                if (--this.current_game.seconds_for_step == 0) {
                  this.stepTimerSubscription.unsubscribe();                  
                }
              });
            }
          }
        });
    });
  }
}
  • Вопрос задан
  • 482 просмотра
Решения вопроса 1
Xuxicheta
@Xuxicheta Куратор тега Angular
инженер
reloadGameInfo = interval(10000);
stepTimer = interval(1000);
second_to_event = 100;

this.stepTimer.subscribe(() => {
  this.second_to_event = this.second_to_event >= 0 ? this.second_to_event - 1 : 0;
  if (this.second_to_event === 0) {
    // make request at second_to_event equals to 0 and set second_to_event if request success
  }
});

this.reloadGameInfo.pipe(
  filter(() => this.second_to_event > 0
)
  .subscribe(() => {
    // do 10000 periodic task
  })

ну вот как то так
switchMap не подойдет, он завершает предыдущий обсервабл в цепочке, т.е. ваш interval завершится. Если не хотите вызывать запросы в сабскрайбе, можно использовать flatMap
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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