Нужно позвонить в услугу внутри условного, который находится внутри подписки - PullRequest
1 голос
/ 26 февраля 2020

Так что внутри моего ngOnInit я получаю некоторый объект из angular firestore, затем мне нужно выполнить некоторые логики c возвращаемого значения, вращаясь вокруг даты последнего обновления. Если последнее обновление было сделано сегодня, то я хочу затем обновить последнее обновленное до сегодняшнего дня с отметкой времени.

Это работает нормально, однако, когда я вызываю this.planService.updatePlan (), это вызывает выполнение кода дважды и все выполняется дважды в рамках подписки. Я предполагаю, что это потому, что подписка еще не «завершена» и вызывает переоценку оператора if.

Я довольно новичок в rx Js, поэтому я полагаю, что проблема заключается в моем непонимании порядка операций.

Так, как я могу вызвать мой planService.updatePlan внутри блока else, который является текущим без повторного выполнения?

Любая помощь будет оценена !!

  ngOnInit() {  
    this.subscription = this.planService.getActivePlan()
      .subscribe(result => {     

        if(result[0].excludeWeekends){
          if(moment().day() == 0 || moment().day() == 6){
            this.lockPlan = true;
          }else {
            this.lockPlan = false;
          }        
        }

        let testForSameLastUpdated  = moment(moment(result[0].lastUpdated).format('YYYY-MM-DD'));
        let testForSameToday = moment(moment().format('YYYY-MM-DD'));

        if(!moment(testForSameLastUpdated).isSame(testForSameToday)){
          console.log("Not updated today");
          result[0].variableDailyLeft = result[0]['dailyleft']; 

          this.updatePlanData(result[0]);

        }else{
          console.log("Plan has been updated today");               
          result[0].lastUpdated = this.today.format('YYYY-MM-DDTHH:mm:ss.SSS');

          this.planService.updatePlan(result[0]['id'], result[0])
          .then( res => {
            this.activePlan = result[0];
            }
          )
        }            
      });
  }

Мой код getActivePlan () выглядит следующим образом

    getActivePlan(){  
        this.active$ = new BehaviorSubject(true);
        return this.plan$ = this.active$.pipe(
            switchMap(active => 
                this.db
                .collection<Plan>('plans', ref => ref.where
                ('activePlan', '==' ,active))                  
                .valueChanges({idField:'id'})
            ),
        );

    }

И мой updatePlan ()

    updatePlan(id, plan){
        return this.db.collection('plans').doc(id).set(plan);
    }
...