Как дождаться полного выполнения функции в angular

Привет, я пытаюсь получить данные о пользователе в angular и на основе пользовательских значений, которые мне нужны для выполнения конкретной задачи, я могу сделать вызов API, но ответ занимает некоторое время, и поэтому я не могу проверить условие.

  ngOnInit() {

   this.getUserDetails();

  if (this.user.PrivacyNotice) //getting undefined here
  {

  }
  else
  {

  }
}

getUserDetails() {
  this.user.Email = "[email protected]";

  this.bookingListSubscription = 
  this.restService.getUserProfile(this.user).subscribe(
  data => {
   this.user = data;
  });
}

Здесь пользователь — это объект типа UserVM Model, который содержит логическое поле PrivacyNotice.

Ниже приведен метод службы, который выполняет вызов API.

getUserProfile(user: UserVM): Observable<any> {
return this.http.post<UserVM>(this.getAPI('FetchUserProfile'),user,
 this.httpOptions).pipe(
map(data => data),
catchError(this.handleError<any>('getUserProfile'))
);
}

если я хочу проверить значение логического флага PrivacyNotice, который возвращается из API, так как я могу этого добиться.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
0
882
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете использовать map или оператора tap. Что-то вроде этого:

import { tap } from 'rxjs/operators';

...    

ngOnInit() {

  this.getUserDetails()
    .subscribe((user) => {
      if ((this.user.PrivacyNotice))
      {
        -- -- --
      } else {
        -- -- --
      }    
    });
}

getUserDetails() {
  this.user.Email = "[email protected]";
  return this.restService.getUserProfile(this.user).pipe(
      tap(data => this.user = data)
    );
}

Или лучше, просто избавьтесь от функции getUserDetails в первую очередь, так как на данный момент она не кажется очень полезной:

ngOnInit() {

  this.user.Email = "[email protected]";

  this.restService.getUserProfile(this.user)
    .subscribe((user) => {
      if ((this.user.PrivacyNotice))
      {
        -- -- --
      } else {
        -- -- --
      }    
    });
}

Обычно, пока вы находитесь в состоянии загрузки, отображается индикатор загрузки:

Пример:

loading = ture;
ngOnInit() {
 this.getUserDetails();
}


getUserDetails() {
  this.user.Email = "[email protected]";

  this.bookingListSubscription = 
  this.restService.getUserProfile(this.user).subscribe(
  data => {
   this.user = data;
   if ((this.user.PrivacyNotice))
   {
   ------
   }
   else
   {
   ------
   }
   loading = false;
  });
}

и в вашем *.html

<div *ngIf = "loading else #loaded">
  Loading...
</div>
<ng-template #loaded>
  The data is loaded, display them as you wish
</ng-template>

Спасибо за ответ, сэр

user10884307 12.02.2019 13:35

это можно сделать, используя логическое значение. здесь я взял завершено как логическое значение. После того, как данные будут назначены пользователю, логическое значение теперь будет изменено на true, и вы можете использовать его в соответствии с вашими требованиями, показывать ли счетчик вызова метода и т. д.

completed=false;
 ngOnInit() {

 this.getUserDetails();
 if (completed){

if ((this.user.PrivacyNotice)) //getting undefined here
{
   ------
}
else
{
   ------
}
}
}

getUserDetails() {
  this.user.Email = "[email protected]";

  this.bookingListSubscription = 
  this.restService.getUserProfile(this.user).subscribe(
  data => {
   this.user = data;
   this.completed=true;
  });
}

Спасибо за ответ, сэр, я попробую

user10884307 12.02.2019 13:35

Другие вопросы по теме