Angular 如何使用可观察模式返回Subscribe方法的结果
我有Angular 如何使用可观察模式返回Subscribe方法的结果,angular,rxjs,angular-router-guards,Angular,Rxjs,Angular Router Guards,我有getNewToken和有usertoken或permission方法。第一个返回令牌并设置用户数据,然后第二个在我们设置用户数据后进行检查-如果他有权限查看警卫中的内容 所以我需要等待第一个结果,然后检查是否有权限。我需要从canActivateGuard返回true或false 所以这可以通过promise模式来解决 import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, CanActiva
getNewToken
和有usertoken或permission
方法。第一个返回令牌并设置用户数据,然后第二个在我们设置用户数据后进行检查-如果他有权限查看警卫中的内容
所以我需要等待第一个结果,然后检查是否有权限。我需要从canActivateGuard返回true
或false
所以这可以通过promise模式来解决
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot, Router } from '@angular/router';
import { AuthStoreService } from '@core/services/auth-store.service';
import { Observable, of, Subject } from 'rxjs';
import { catchError, map, tap } from 'rxjs/operators';
import { LoginService } from 'src/api/controllers/Login';
import { OAuthService } from 'angular-oauth2-oidc';
/**
* HasPermissionGuard - Used for checking the user permission for the core routing
* in order to check if the user has permission to see the page
*/
@Injectable()
export class HasPermissionGuard implements CanActivate {
constructor(
private loginService: LoginService,
private oauthService: OAuthService,
public authStore: AuthStoreService,
private router: Router
) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<any> | Observable<any> {
return this.getNewToken().toPromise().then(data => {
return this.hasTheUserTokenOrPermission(route);
}).then((shouldWeProvideAccess: boolean) => {
console.log('shouldWeProvideAccess', shouldWeProvideAccess);
if (shouldWeProvideAccess) {
return shouldWeProvideAccess;
} else {
this.router.navigate(['/403']);
return shouldWeProvideAccess;
}
})
}
getNewToken(): Observable<any> {
return this.loginService.token({ token: this.oauthService.getAccessToken() }).pipe(
tap(response => {
this.authStore.setData(response);
},
), catchError(err => {
this.router.navigate(['/405']);
return Observable.throw(err);
}));
}
hasTheUserTokenOrPermission(route): boolean {
if (!this.authStore.hasUserInfo()) {
return true;
}
if (this.authStore.hasPermission(route.data.permission)) {
return true;
}
return false;
}
}
我明白了
类型“Subscription”不能分配给类型“Promise | Observable”。
错误
如何从这里返回结果?订阅中不返回值。因此,请修改以下内容
hasTheUserTokenOrPermission(route): boolean {
let shouldWeProvideAccess = false;
if (!this.authStore.hasUserInfo()) {
shouldWeProvideAccess = true;
}
if (this.authStore.hasPermission(route.data.permission)) {
shouldWeProvideAccess = true;
}
console.log('shouldWeProvideAccess', shouldWeProvideAccess);
if (shouldWeProvideAccess === false) {
this.router.navigate(['/403']);
}
return shouldWeProvideAccess;
}
然后
return this.getNewToken().subscribe(data => {
this.hasTheUserTokenOrPermission(route);
})
调用.subscribe()
时,返回订阅。如错误所示,您需要返回可观察的
,而不是订阅
所以,不要订阅:-)
您可以使用map
操作符将getNewToken()
调用转换为可观察的
:
canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):可观察{
返回此.getNewToken().pipe(
地图(()=>{
const allow=this.hasseusertokenorpermission(路由);
如果(!允许){
this.router.navigate(['/403']);
}
允许返回;
})
)
};
我知道我可以直接返回-我问如何从订阅返回结果对于路由守卫,订阅是不合适的。使用observable模式时,只需返回发出布尔值的observable。当使用route guard时,框架在内部订阅。您出错的原因是guard必须返回observable或promise,但通过调用subscribe,您将返回订阅。
return this.getNewToken().subscribe(data => {
this.hasTheUserTokenOrPermission(route);
})