进行2次异步调用,并将响应从第一个传递到第二个

时间:2019-12-20 12:14:53

标签: angular typescript auth0

我有一个使用Auth0的站点,以确定用户是否是管理员,我在mongoDB数据库中为该用户存储了一个字段,并附有与其关联的电子邮件,这些电子邮件是我从getUser()函数中的python flask API端点读取的。但是,当用户登录时,我收到Auth0用户电子邮件的响应,并将相关字段传递到getUser()函数中,但是我想不出解决方案来链接这些调用。到目前为止,我已经尝试过使用Promise和Subscription,但无济于事。

web.service.ts

getUser(email) {
        return this.http.get('http://localhost:5000/api/v1.0/user/' + email).subscribe(resp => {
            this.user_info = resp;
        });
    }

home.component.ts

export class HomeComponent { 
    constructor(private authService: AuthService,
                private webService: WebService) {}

    user_email;
    is_admin;

    ngOnInit() {

      this.authService.userProfile$.subscribe(resp => {
          if (resp != null) {
            this.user_email = resp.email
          }
      }); //after this aync call is completed, I want to pass the user_email into the getUser()
          //function and set is_admin depending on the response
}

2 个答案:

答案 0 :(得分:0)

  this.authService.userProfile$.pipe(switchMap((resp) => this.webService.getUser(resp.email))).subscribe((resp) => {
    this.is_admin = resp.is_admin;
  });

  getUser(email) {
    return this.http.get('http://localhost:5000/api/v1.0/user/' + email)
  } // Dont subscribe here to compose as done above

您始终可以使用运算符从一个流组成另一个流。在这里,我将userProfile$流映射到getUser()流。我在这里使用switchMap运算符,如果您的getUser流在api处于运行状态时发出了值,它将取消userProfile$方法。

答案 1 :(得分:-2)

您可以在从Auth服务获得回复后执行您的连锁活动:即:

  this.authService.userProfile$.subscribe(resp => {
      if (resp != null) {
        this.user_email = resp.email;
        this.getUser(this.user_email);
      }
  });

或者使用promise和await调用的组合,这样代码将一直等待,直到解决promise为止,然后继续转发