canActivate возвращает нежелательное значение - PullRequest
1 голос
/ 13 марта 2019

У меня есть метод canActivate, который я хотел бы реализовать, но по какой-то причине (которую я, вероятно, не знаю, так как я новичок), возвращаемое значение происходит до завершения subsribe.

   canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean
    {
        debugger;
        this.ms_zehut = JSON.parse(localStorage.getItem('id'));

        this.adminService.checkIsAdmin().subscribe(res=>{
            this.isCanActivate = true;
           
        },error=>{
            debugger;
            this.isCanActivate = false;   
            this.router.navigateByUrl("/foo");
            
        });
        return this.isCanActivate;
    }

 checkIsAdmin() : Observable<ResultOfOperation<object>>
     {
        const headers = new HttpHeaders().set('Content-Type','application/json');
        console.log("service before get");
        return this._httpClient.get<ResultOfOperation<Object>>(AppSettings.getIsAdmin, {headers: headers})
            .pipe(
                tap(data => { 
                    console.log("service get result", data);
                })
            );
     }

Что я должен сделать, чтобы получить результат подписки до того, как this.canActivate будет возвращен?

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

Проблема в том, что код не будет ждать до завершения API.

Попробуйте async / await

больше информации:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

Измените файл службы, реализующий async / await, следующим образом

async checkIsAdmin() {
    const headers = new HttpHeaders().set("Content-Type", "application/json");
    console.log("service before get");

    const response = await this. _httpClient.get<ResultOfOperation<Object>>(AppSettings.getIsAdmin, {headers});
    return response; // check here if not json use response.json()
}

В файле защиты

async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    this.isCanActivate = await this.adminService.checkIsAdmin();


    // check the if the response returned is of 'error' or ResultOfOperation<object>
    if (this.isCanActivate === your object type){
        return true;
    }

    // not logged in so redirect
    this.router.navigateByUrl("/foo");   
}

Надеюсь, это поможет:)

2 голосов
/ 13 марта 2019

canActivate также принимает наблюдаемые. если возвращаемое значение является наблюдаемым, оно будет подписываться на него неявно.

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Observable<boolean>
    {
        debugger;
        this.ms_zehut = JSON.parse(localStorage.getItem('id'));

        return this.adminService.checkIsAdmin()
    }

используйте catchError для обработки неудачного ответа

 return this._httpClient.get<ResultOfOperation<Object>>(AppSettings.getIsAdmin, {headers: headers})
            .pipe(
                tap(data => { 
                    console.log("service get result", data);
                }),
                catchError(err = > { 
                  this.router.navigateByUrl("/foo");
                })
            );
...