私はまだrxjsがどのように機能するかについて混乱しています。
私はIonicアプリを構築して、サーバーにリクエストを行い、jsonを期待しています。http.postにサブスクライブし、必要なデータを取得することに成功しました。
しかし今私の問題は、ストレージから取得したhttpリクエストで認証トークンを渡す必要があることです。 Storageの準備が整い、http.postリクエストを呼び出す前にStorageからトークン値を取得する必要があるため、これは問題です。
これは私が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());
})
});
}
ここから呼ばれます
ionViewDidLoad (){
this.merchandisingDataService.getPlanograms()
.subscribe(Planogram => this.planograms = Planogram);
}
しかし、これを実行しようとすると、次のエラーが発生します
プロパティ「subscribe」はタイプ「Promise」には存在しません。
私の目的を達成するための最良の方法は何ですか?
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);
}
);
}
以下を変更することで、.then()
を使用できます。
_ionViewDidLoad () {
this.merchandisingDataService.getPlanograms()
.then(Planogram => this.planograms = Planogram);
}
_
または、getPlanograms
がObservable
を返すようにすることもできます。
_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()
を使用できます。