Как ждать, пока функция полностью не выполнится в угловых - PullRequest
0 голосов
/ 12 февраля 2019

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

  ngOnInit() {

   this.getUserDetails();

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

  }
  else
  {

  }
}

getUserDetails() {
  this.user.Email = "test@test.com";

  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, то как я могу этого добиться.

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

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

Пример:

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


getUserDetails() {
  this.user.Email = "test@test.com";

  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>
0 голосов
/ 12 февраля 2019

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

completed=false;
 ngOnInit() {

 this.getUserDetails();
 if(completed){

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

getUserDetails() {
  this.user.Email = "test@test.com";

  this.bookingListSubscription = 
  this.restService.getUserProfile(this.user).subscribe(
  data => {
   this.user = data;
   this.completed=true;
  });
}
0 голосов
/ 12 февраля 2019

Вы можете использовать оператор map или tap.Примерно так:

import { tap } from 'rxjs/operators';

...    

ngOnInit() {

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

getUserDetails() {
  this.user.Email = "test@test.com";
  return this.restService.getUserProfile(this.user).pipe(
      tap(data => this.user = data)
    );
}

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

ngOnInit() {

  this.user.Email = "test@test.com";

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