如何等到函数完全按角度执行

时间:2019-02-12 12:21:32

标签: angular angular6 observable

嗨,我正在尝试获取用户详细信息,并根据用户值执行特定任务,我能够对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模型类型的对象,其中包含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'))
);
}

如果要检查从api返回的布尔值标志PrivacyNotice的值,那么如何实现此目的。

3 个答案:

答案 0 :(得分:1)

通常,只要您处于加载状态,就会显示一个加载指示器:

示例:

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>

答案 1 :(得分:0)

您可以使用maptap运算符。像这样:

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 {
        -- -- --
      }    
    });
}

答案 2 :(得分:0)

这可以通过使用布尔值来完成。 在这里,我将完成作为布尔值。 数据分配给用户后,布尔值现在将更改为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;
  });
}