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

您可以在這裏查看Gunter的答案:http://stackoverflow.com/questions/38425461/angular2-canactivate-calling-async-function獲取靈感並更深入地瞭解異步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() ; 
    } 
}