可以使用RxJS中的operator,比如switchMap()来实现等待API响应并且避免重复调用API的问题。具体实现方式可以参考下面的代码示例:
import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router';
import { Observable } from 'rxjs/Observable';
import { AuthService } from './auth.service';
import { switchMap } from 'rxjs/operators';
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private auth: AuthService, private router: Router) { }
canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | boolean {
return this.auth.getUser().pipe(
switchMap(user => {
if (user) {
return Observable.of(true);
} else {
this.router.navigate(['/login']);
return Observable.of(false);
}
})
);
}
}
在上面的代码中,AuthGuard是一个CanActivate的守卫,其实现了等待API响应并且避免重复调用API的问题。具体来说,在canActivate()方法中,我们使用了switchMap()运算符来等待getUser()方法返回的Observable对象,并根据用户是否存在来返回一个Observable
这种使用RxJS的做法可以大大简化代码,并减少对API的不必要调用,提高页面的运行效率。