Angular登录令牌并同步获取用户数据

时间:2019-01-06 22:51:56

标签: angular

我的用例似乎很简单,但是尽管我付出了很多努力,但仍无法正常工作。

在我的角度应用程序中,我有一个登录组件,该组件仅在我的身份验证服务上调用登录方法。

我需要此登录方法来做两件事:

  1. 进行API调用以获取我的令牌
  2. 然后使用该令牌调用我的 用户服务以获取更多用户数据。

两次调用的结果完成后,登录方法可以返回true或false来确定成功。

我的两个调用似乎通过嵌套订阅函数而正确启动。但是login方法会在第二次调用完成之前返回其值,因为它会异步触发。

因此,在我的UI中,在第二次调用完成之前,我得到了短暂的“登录失败”,然后按预期工作。

必须有更好的方法! 我正在使用Angular 6。

private loggedIn$ = new BehaviorSubject<boolean>(this.hasToken());

public login(username: string, password: string): Observable<boolean> {

this.retrieveToken(username, password).subscribe(result => {
  this.retrieveUserProfile().subscribe(result =>{
    this.loggedIn$.next(true);
  })
})

return this.isLoggedIn  // this returns before retrieve profile is completed

}

1 个答案:

答案 0 :(得分:0)

最重要的是,您需要使用诸如mergeMap之类的东西,而不是订阅多个可观察对象

也不会等待obserable.subribe之外的任何语句,因此(在您的情况下)结果将在分配之前返回。

您的逻辑需要类似于tihs

return this.observable1().pipe(mergeMap((param1) => {
  return this.observable2().pipe(map((param1) => {
    return <logged_in_Result>;
  }));
}));