2016-08-30 3 views
0

私は機能CanActivate(に問題がある)は、関数の応答を受信しない、どのように私はこの問題を解決することができますか?2角度 - 常にundefinedを返しますverifytoken変数<strong>トークン</strong>あるCanActivate未定義値

private verifytoken() 
    { 
     if(this._functionservice.getCookie("Cookie") != '' && this._functionservice.getCookie("Cookie") != "undefined") 
    { 

    // 1 - You are returning nothing here, only inside the subscriptions. So, you wont be able to get any data if you get inside this if statement 
     this._symfonyservice.validtoken().subscribe(
      data => {this.resut = data; 
         if(this.resut['is_valid']==true) 
         { 
         console.log('true'); 

         return true; 
        } 
        else 
        { 
         this._functionservice.deleteCookie("Cookie"); 
         console.log('false'); 
         this.router.navigate(['login']); 
         return false; 
        } 
      }, 
      error =>{ 
         alert("Sessão Expirada"); 
         this._functionservice.deleteCookie("Cookie"); 
         console.log('false'); 
         this.router.navigate(['login']); 
         return false; 
        } 
      ); 

    } 
    else{ 
     // 2 - you are navigating to another place, so you wont be able to get any data from here 
     this.router.navigate(['login']); 
     return false; 
    } 

    } 
    canActivate() { 
    let token = this.verifytoken(); 
    console.log(token); 
    return token; 
    } 

だから、あなたはif文の内部でサブスクリプションを返すために持っているか、あなたは文句を言わない任意のデータを取得することができ:

コードは

private verifytoken() 
    { 
     if(this._functionservice.getCookie("Cookie") != '' && this._functionservice.getCookie("Cookie") != "undefined") 
    { 
     this._symfonyservice.validtoken().subscribe(
      data => {this.resut = data; 
         if(this.resut['is_valid']==true) 
         { 
         console.log('true'); 

         return true; 
        } 
        else 
        { 
         this._functionservice.deleteCookie("Cookie"); 
         console.log('false'); 
         this.router.navigate(['login']); 
         return false; 
        } 
      }, 
      error =>{ 
         alert("Sessão Expirada"); 
         this._functionservice.deleteCookie("Cookie"); 
         console.log('false'); 
         this.router.navigate(['login']); 
         return false; 
        } 
      ); 

    } 
    else{ 
     this.router.navigate(['login']); 
     return false; 
    } 

    } 
    canActivate() { 
    let token = this.verifytoken(); 
    console.log(token); 
    return token; 
    } 

答えて

0

私はここで2つの問題が見つかりました。

--- EDIT --- が質問に答える:

Promissesは、あなたがメソッドを呼び出した後にサブスクライブ呼び出すことができ、promissesを返し、そう。 verifytoken()

あなたはpromisseを返却する必要があり、その後、canActivate()にあなたは私が怒鳴る行ったように、このpromisseに加入するか、同期値を待つ必要があります。

private verifytoken(){ 
    if(this._functionservice.getCookie("Cookie") != '' && this._functionservice.getCookie("Cookie") != "undefined") 
    { 
    // here I returned the promisse 
    return this._symfonyservice.validtoken().subscribe(
     data => { 
     this.resut = data; 

     if(this.resut['is_valid']==true){ 
      console.log('true'); 
      return true; 
     } 
     else 
     { 
      this._functionservice.deleteCookie("Cookie"); 
      console.log('false'); 
      this.router.navigate(['login']); 
      return false; 
     } 
     }, 
     error =>{ 
      alert("Sessão Expirada"); 
      this._functionservice.deleteCookie("Cookie"); 
      console.log('false'); 
      this.router.navigate(['login']); 
      return false; 
     } 
    ); 

    } 
    else{ 
     this.router.navigate(['login']); 
     return false; 
    } 

} 

ここにトリックがあります。 promisse関数の内部から関数canActivate()を返すことはできません。したがって、あなたは2つのオプションがあります:

1 - (async)は、canActivateを呼び出しているpromisseを呼び出し、そこから変更を取得します。

canActivate() { 
    return this.verifytoken(); 
} 

2 - (同期)あなたは

canActivate() { 
    var token = this.verifytoken(); 


    while(token == undefined){ 
    // wait until token has been set 
    } 

    return token; 
} 
+0

それを返すことができますので、promisseがトリガされ、応答がトークン変数に代入されたときを検出するためにしばらく置いてあるので、どのように私は待つことができますレスポンスを返してからtrueを返しますか? – user26776

+0

私はあなたにこれを行う方法のアイデアを与えるために私の答えを編集しました。 – vinagreti

関連する問題