web-dev-qa-db-ja.com

プロパティ「subscribe」はタイプ「Promise」に存在しません

私はまだ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」には存在しません。

私の目的を達成するための最良の方法は何ですか?

9
dr_ermio

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);
        }
    );
}
1
dr_ermio

以下を変更することで、.then()を使用できます。

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

または、getPlanogramsObservableを返すようにすることもできます。

_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()を使用できます。

9
0xcaff