2017-05-14 51 views
1

rxjsの動作についてはまだ混乱しています。プロパティ 'subscribe'が 'Promise'タイプに存在しません

私はサーバーにリクエストしてjsonを期待するIonicアプリを構築しています。私は正常にhttp.postを購読して、必要なデータを得ることができました。

しかし、今私の問題は、私がストレージから取得するhttp要求で認証トークンを渡す必要があるということです。これは問題です。ストレージが準備され、http.postリクエストを呼び出す前に私がトークンの値を取得するまで待つ必要があるからです。

私はしかし、ここで

ionViewDidLoad(){ 
    this.merchandisingDataService.getPlanograms() 
     .subscribe(Planogram => this.planograms = Planogram); 
} 

から呼び出される私のJSONデータ

getPlanograms() { 

    //API URL 
    let requestURL = 'https://myapiurlhere'; 
    let headers = new Headers({'Content-Type': 'application/json'}); 

    return this.storage.ready().then(() => { 

     return this.storage.get('id_token').then((val) => { 

      headers.append('Authorization', 'Bearer ' + this.authCredentials.token); 
      let options = new RequestOptions({headers: headers}); 
      return this.http.post(requestURL, {}, options) 
       .map(response => <Planogram[]>response.json()); 

     }) 
    }); 
} 

を取得しようとしていますここは私がこれを行うにしようとすると、私は次のようなエラー

を取得し、あります

プロパティ 'subscribe'が 'Promise'タイプに存在しません。

私の目的を達成するにはどうすればよいでしょうか?

+4

'getPlanograms()' 'Promise'を返します。約束を「購読する」ことはできません。あなたは「約束」し、観測可能なものに「購読する」ことができます。 – 0xcaff

+0

ご意見ありがとうございます。私のトークン変数がStorageから取得された後でも、それを実行しながらhttp.post要求から観測値を戻し続ける最良の方法は何でしょうか? –

答えて

1

caffinatedmonkeyの提案に続いて、私はこの作業機能になってしまった:

getPlanograms() { 

    //API URL 
    let requestURL = 'https://myapiurlhere'; 

    return Observable 
     .fromPromise(this.storage.get('id_token')) 
     .flatMap(token =>{ 
      let headers = new Headers({'Content-Type': 'application/json'}); 
      headers.append('Authorization', 'Bearer ' + token); 
      let options = new RequestOptions({headers: headers}); 
      return this.http.get(requestURL, options) 
       .map(response => <Planogram[]>response.json()) 
       .catch(this.handleError); 
     } 
    ); 
} 
4

あなたは変更することにより、.then()で消費できます。

ionViewDidLoad() { 
    this.merchandisingDataService.getPlanograms() 
     .then(Planogram => this.planograms = Planogram); 
} 

それとも、あなたがObservableを返すgetPlanograms作ることができます。あなたが質問で行ったように

getPlanograms() { 

    // API URL 
    let requestURL = 'https://myapiurlhere'; 
    let headers = new Headers({'Content-Type': 'application/json'}); 

    // this converts from promise to observable 
    return Observable.fromPromise(this.storage.ready() 
     .then(() => this.storage.get('id_token')) 
     .then((val) => { 
      headers.append('Authorization', 'Bearer ' + this.authCredentials.token); 
      let options = new RequestOptions({headers: headers}); 

      return this.http.post(requestURL, {}, options) 

       // map converts from observable to promise 
       // (returned by response.json()) 
       .map(response => <Planogram[]>response.json()); 
     }); 
    })); 
} 

今、あなたは.subscribe()で消費することができます。

+0

約束を観測可能に変換することで素晴らしいアイデア:) +1ありがとう –

関連する問題