0

У меня есть 2 услуги (AuthService & AuthRedirectService)Угловая возвращение 2. Обслуживание неопределенными

AuthService использует Http сервис для получения простых данных {"status": 4} с сервера и return response.json().status < - номер

AuthRediredService реализует OnActivate и использует AuthService обслуживание. Это единственный метод AuthService.GetStatus(): число, но он возвращает undefined

AuthService

GetStatus(): number { 
    let status: number; 
    this.http.get(this.host + "/api/auth/") 
    .subscribe((value: Response) => { 
     status = value.json().status; 
     console.log(value.json().status); // write real number 4 
    }); 
    return status; // 4 
    } 

AuthRedirectService

canActivate() : boolean 
    { 
    console.log(this.auth.GetStatus()); // undefined !!!!!!!! 
    if(this.auth.GetStatus() == StatusCode.Logined) 
    { 
     // redirect code 
     return false; 
    } 
    return true; 
    } 
+2

'http.get' является асинхронным, вы уже вернетесь из' GetStatus() 'перед его разрешением. – silentsod

+1

Вы можете проверить ответ Гюнтера здесь: http://stackoverflow.com/questions/38425461/angular2-canactivate-calling-async-функция для вдохновения и более глубокое понимание реализаций async canActivate(). – silentsod

ответ

0

Это простой Javascript асинхронной проблема и это не связано с Angular2.

В JavaScript, при вызове метода асинхронной, как HTTP-вызов, который может решить после 10mintues, вы не можете ожидать, чтобы получить результат сразу:

Скажем:

myAsyncFunction(){ 
     let theResult; // First: this line fired 
     callAHttpServiceThatTakes1Minute() // Second: we called the function that returns the result in 1 mutine 
     .then((res)=>{ 
      theResult = res; // Forth : will be available after 1 minute 
     }); 

     console.log(theResult); // Third : This is undefined because number Forth hasn't finished yet. 
    } 

Чтобы устранить проблему, хотя, ваш маршрут должен быть чем-то вроде этого:

{ path : 'home' , component : HomePageComponent , resolve : { user : GetStatusResolver } } , 

И потом:

@Injectable() 
export class GetStatusResolver implements Resolve { 
    constructor (private auth : AuthService) { 
    } 

    resolve (route : ActivatedRouteSnapshot , state : RouterStateSnapshot) : Observable<User> { 
     return this.auth.GetStatus() ; 
    } 
} 
Смежные вопросы