小编Igo*_*gor的帖子

Angular 5(Angular 2+),第二个守卫不等待第一个守卫完成http请求

我有一个应用程序,其中有两个警卫(AuthGuard - 用于登录用户,AdminGuard - 用于管理员)。首次加载时 AuthGuard 会发出 http 请求以从 API 获取用户信息。问题是,当您尝试使用两个防护访问路由时,AdminGuard 不会等待 AuthGuard 完成请求并设置用户,以便 AdminGuard 可以检查用户的角色,并且应用程序会中断。我知道它会崩溃,因为用户未定义。我正在寻找如何让第二个守卫等待第一个守卫完成的解决方案。

{
    path: 'admin',
    component: AdminComponent,
    canActivate: [AuthGuard, AdminGuard]
},

@Injectable()
export class AuthGuard implements CanActivate {
    constructor(
    private authService: AuthService,
    private http: HttpClient) { }

    canActivate(
        next: ActivatedRouteSnapshot,
        state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {

        return this.http.get('https://jsonplaceholder.typicode.com/users').map(res => {
            console.log('Auth Guard.');
            console.log(res);
            this.authService.user = {role: 'admin'};

            return true;
     });

         return false;
    }
}

@Injectable()
export class AdminGuard implements CanActivate {
    constructor(private authService: AuthService) …
Run Code Online (Sandbox Code Playgroud)

javascript request typescript angular

6
推荐指数
1
解决办法
4190
查看次数

rxjs:用管道返回值(map)

如何在使用管道和映射时返回值,就像在这个场景中一样:

\n\n
return this.service.someEvent().pipe(\n  map(x => {\n    return this.service.someValue;\n  })\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

但该值永远不会返回,因为从未订阅该事件,如果我像这样使用它:

\n\n
const a = this.service.someEvent().pipe(\n  map(x => {\n    return this.service.someValue;\n  })\n)\n\nreturn a.subscribe();\n
Run Code Online (Sandbox Code Playgroud)\n\n

我收到错误(我知道这是错误的)。

\n\n
TS2322: Type\xc2\xa0'Subscription'\xc2\xa0is\xc2\xa0not\xc2\xa0assignable\xc2\xa0to\xc2\xa0type\xc2\xa0'boolean\xc2\xa0|\xc2\xa0Observable<boolean>\xc2\xa0|\xc2\xa0Promise<boolean>'. \xc2\xa0\xc2\xa0Type\xc2\xa0'Subscription'\xc2\xa0is\xc2\xa0not\xc2\xa0assignable\xc2\xa0to\xc2\xa0type\xc2\xa0'Promise<boolean>'. \xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0Property\xc2\xa0'then'\xc2\xa0is\xc2\xa0missing\xc2\xa0in\xc2\xa0type\xc2\xa0'Subscription'.\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以我需要我的方法来返回值。

\n\n

更新:\n更好的描述(我需要使用最新版本的 rxjs 复制此代码):

\n\n
canActivate(next: ActivatedRouteSnapshot,\n               state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {\n  return this.service.something().map(x => {\n    if (x) {\n      return true;\n    } else {\n      return false;\n    }\n  })\n
Run Code Online (Sandbox Code Playgroud)\n\n

}

\n\n

需要用管道内的地图来完成(据我所知)。

\n

javascript rxjs reactivex angular

6
推荐指数
1
解决办法
2万
查看次数

标签 统计

angular ×2

javascript ×2

reactivex ×1

request ×1

rxjs ×1

typescript ×1