How to wait for guards in Angular

后端 未结 1 1348
不知归路
不知归路 2020-12-16 20:29

If i specify three guards on a route, it seems as though all guards are evaluated immediately.

{path: \'\', component: OptionsComponent, canActivate: [ GuardOn

相关标签:
1条回答
  • 2020-12-16 21:24

    I don't think that's possible in the 4.1.3. Here is the code that runs the guards:

      private runCanActivate(future: ActivatedRouteSnapshot): Observable<boolean> {
        const canActivate = future._routeConfig ? future._routeConfig.canActivate : null;
        if (!canActivate || canActivate.length === 0) return of (true);
        const obs = map.call(from(canActivate), (c: any) => {
          const guard = this.getToken(c, future);
          let observable: Observable<boolean>;
          if (guard.canActivate) {
            observable = wrapIntoObservable(guard.canActivate(future, this.future));
          } else {
            observable = wrapIntoObservable(guard(future, this.future));
          }
          return first.call(observable);
        });
        return andObservables(obs);
      }
    

    This simplified piece:

    // array of all guards
    canActivate.map((guard)=>{
         observable = guard.canActivate()
    })
    

    runs all guards in a sequence without waiting for the previous to finish.

    One possible solution would be to have one service that implements CanActivate and combines other guards:

    class Combined {
      constructor(private gA: GuardA, private gB: GuardB) {}
    
      canActivate(r, s) {
            return gA.canActivate(r, s).then(()=>{ return gB.canActivate() });
      }
    }
    
    ... 
    {path: '', component: OptionsComponent, canActivate: [ Combined ]}
    
    0 讨论(0)
提交回复
热议问题