2017-01-04 6 views
2

私はいくつかのプロパティを持つサービスを持っています。これらのプロパティは、コンポーネントがロードされる前に初期化されます(他のhttp呼び出しのパラメータとして使用されます)。 Route CanActivateメソッドは、プロパティの初期化後にtrueを取得する、またはエラー時にfalseを取得する、次のメソッドを呼び出すために使用されます。コンパイルエラーが返されます:宣言された型が 'void'でも 'any'でもない関数は、値を返す必要があります。どのように私はこのエラーを避けることができますか?角2でデータを初期化する方法

public setupSession(): boolean { 

    this._http.get('myservice_url') 
    .map (
     (response: Response) => <any>response.json()) 
     .subscribe (
     data => { 
      this.property1 = data.property1; 
      this.property2 = data.property2; 
      return true; 
     }, 
     err => { 
      console.error(err) 
      return false; 
     } 
    ) 
} 

編集: @K。 Daniekは助けてくれてありがとう!私はこの記事の助けを借りて解決策を見つけたlink。今度は、の前にセットアップ完了を確実に保つことができます。

サービス方法:

public setupSession(): Promise<any> { 
    var observable = this._http.get('myservice_url') 
     .map((response: Response) => { 
      var res = response.json(); 
      return res; 
     }); 

    observable.subscribe(data => { 
     this.property1 = data.property1; 
     this.property2 = data.property2; 
    }); 

    return observable.toPromise(); 
} 

canActivate方法:

canActivate() { 
    return this._sessionService.setupSession().then(() => { 
     return true; 
    }); 
} 

答えて

0

この関数の戻り値が実際にある場合は特に、私は、ブール値としてこの関数の型を宣言するポイントが表示されませんブール値ではなくデータです。

てみてください以下のコード:

public setupSession() { 

    this._http.get('myservice_url') 
    .map(
    (response: Response) => <any>response.json()) 
    .subscribe(
    data => { 
     this.property1 = data.property1; 
     this.property2 = data.property2; 
    }, 
    err => { 
     console.error(err); 
    } 
    ) 
} 

編集:私は少しあなたのコードをテストし、ちょうどこの機能を動作させるために、実際に可能であることに気づいていますが、基本的にはブール値を返す必要がありましたsubscribe以降の方法。リファクタリングされたコードは次のようになります。

public setupSession(): boolean { 

    this._http.get('myservice_url') 
     .map(
      (response: Response) => <any>response.json()) 
     .subscribe(
      data => { 
       this.property1 = data.property1; 
       this.property2 = data.property2; 
      }, 
      err => { 
       console.error(err); 
      }); 
    return true; 

} 

httpリクエスト関数はブール値を返します。コンパイラはエラーをスローしません。

EDIT2は:

は、この関数はbooleanタイプになりたい場合は、あなたが関数を呼び出した後boolean値を返す必要があり、聞いてください。実際、この呼び出しは非同期であるため、関数は内部で他のタスクを実行し続け、非同期応答を待機しません。それで、successまたはerror応答を返す前であっても、関数は常にtrue(この特定の場合)を返します。私はcanActivate値を取得することができますどのようにこの場合

public setupSession() { 

    this.http.get(`myservice_url`) 
     .map(data => data.json()) 
     .subscribe(data => { 
       this.property1 = data.property1; 
       this.property2 = data.property2; 
       console.log('works'); 
       return true; 
      }, 
      err => { 
       console.error(err); 
       console.log('error); 
       return false; 
      }); 
} 
+0

あなたは関数が次のコードのエラー、使用する場合には成功したかfalseの場合にtrueを返すようにしたい場合は? canActivateを使用しないと、プロパティを他のhttp呼び出しのパラメータとして使用する前にプロパティが初期化されません。 – Victor

+0

2番目のケースでは、実際のデータが受信される前にbooleanを取得します。 – Victor

+0

@Victor編集した投稿をチェックしてください。 –

関連する問題