Так что внутри моего 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);
}