Angular 将wait/async函数转换为可观测函数的最简单方法

Angular 将wait/async函数转换为可观测函数的最简单方法,angular,asynchronous,async-await,Angular,Asynchronous,Async Await,我不应该在Angular中真正使用async/await方法 所以我想弄明白,如果没有这些方法,如何让它继续下去 我使用的是canActivate函数,它首先调用AuthService,询问PHP当前的JWT令牌是否有效。然而,目前我只有这样做才能做到: 激活 验证令牌 现在我必须在其他地方调用这个validate_token函数,我不想将每个函数都设置为async/await 我在玩一些可观察的东西,但仍然没有任何正确的结果 verify-token.php返回当前令牌是否有效,以及一些其他用

我不应该在Angular中真正使用async/await方法

所以我想弄明白,如果没有这些方法,如何让它继续下去

我使用的是canActivate函数,它首先调用AuthService,询问PHP当前的JWT令牌是否有效。然而,目前我只有这样做才能做到:

激活

验证令牌

现在我必须在其他地方调用这个validate_token函数,我不想将每个函数都设置为async/await

我在玩一些可观察的东西,但仍然没有任何正确的结果

verify-token.php返回当前令牌是否有效,以及一些其他用户比例

您不需要使用async/wait,因为路由守卫和解析程序将等待承诺或可观察的返回,然后再继续

如果所有防护返回true,则导航将继续。如果任何guard返回false,导航将被取消

您的可观察对象只需要返回一个真值或假值

验证令牌

验证令牌 { 返回this.http.postglobals.api_urlvify-token.php, { jwt:localStorage.getItem'token' } } 激活

canActivateroute:ActivatedRouteSnapshot,状态:RouterStateSnashot { var有效_标记:布尔值; 变量角色:数字; 返回此.auth.validate\u令牌 管 tapres=>{ valid_token=res['valid_token'], role=res['role'] }, mapres=>{ return res['valid_token'] }, }
请注意,canActivate guard中的observable返回res['valid_token']

最好使用observable而不是Promise

private authStatusListener = new Subject<boolean>();

constructor(private http: HttpClient) { }

getAuthStatusListener() {
   return this.authStatusListener.asObservable();
}

validate_token()
{
   const user = {email: email, password: password};
   this.http.post<{token: string}>(url, user) .subscribe(response => {
        const token = response.token;
        this.authStatusListener.next(true);
   }, (error: any) => {
        this.authStatusListener.next(false);
   });
 }

您可以查看我的简单项目以了解更多内容

您是否尝试将承诺转换为可观察?Like=>为什么要将observable http.post转换为promise.toPromise,而不是返回您正在寻找的observable?@naeramarth7,因为使用observable它不起作用。有效的\u标记未定义。@carlosiel-Hmm。。。我觉得这是一种解决办法。我的意思是它可能会工作,但我想让它以正确的方式工作,就像从一开始就只使用observable。我改变了我的代码,使其看起来与您的示例类似,但仍然没有定义所有有效的_标记。似乎代码甚至没有进入tap或map内部,因为console.log什么都不做。validate_token后的valid_token变量未定义。抱歉,刚刚发现一个错误。。你需要在canActivate方法中添加return关键字。你能分享你的路由配置吗?嗯,我刚刚查看了你编辑的返回状态代码。我返回var-valid\u标记:boolean;而不是这个.auth.validate\u令牌。现在它可以工作了,但我必须更改verify-token.php的逻辑,因为我在确定用户对canActivate类而不是.php文件的访问权限。我想毕竟没什么大不了的。谢谢大家!@太好了!你能把答案说成是可以接受的吗?关键是我想在modyfing代币的情况下,在每次canActivate运行时更新这个可观察到的。
validate_token()
  {
    return this.http.post(globals.api_url("verify-token.php"), 
      {
        jwt: localStorage.getItem('token')
      }).toPromise()
      .then(result => result)
      .catch(result => result['valid_token'] = false);
  }
private authStatusListener = new Subject<boolean>();

constructor(private http: HttpClient) { }

getAuthStatusListener() {
   return this.authStatusListener.asObservable();
}

validate_token()
{
   const user = {email: email, password: password};
   this.http.post<{token: string}>(url, user) .subscribe(response => {
        const token = response.token;
        this.authStatusListener.next(true);
   }, (error: any) => {
        this.authStatusListener.next(false);
   });
 }
 this.authService.getAuthStatusListener()
  .subscribe(isAuthenticated =>{
    this.loading = isAuthenticated;
 });