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);
        })