2017-03-06 11 views
2

次のサービスからのhttpリクエストの結果を複数のコンポーネントと共有しようとしています。私が経験している問題は、各コンポーネントのgetMe()関数に対する要求が新しいhttp呼び出しを作成することです。 MeServiceサービスは、ページのルートモジュールのプロバイダとして宣言され、各* .component.tsにインポートされるため、サービスを複数回プロバイダ全体として再宣言した(共通の)間違いが原因ではありません子コンポーネント。出力からわかるように、コールの非同期性のために発生している可能性が高くなりますが、間違っていれば私を修正します。Angular2サービスで複数のhttpリクエストを緩和する

import { Injectable } from '@angular/core'; 
import { Headers, Http } from '@angular/http'; 

import 'rxjs/add/operator/toPromise'; 

@Injectable() 
export class MeService { 

    private apiUrl = 'api/get/me'; 

    private me: Object; 

    constructor(private http: Http) { } 

    getMe(): Promise<Object> { 

     console.log("OBSERVATION 1: " + this.me); 

     if (this.me) { 

      //Not sure if this is correct or not, I've never reached this block yet 
      return Promise.resolve(this.me) 

     } else { 

      return this.http.get(this.apiUrl) 
       .toPromise() 
       .then(response => { 

        console.log("OBSERVATION 2: " + this.me); 

        this.me = response.json(); 

        console.log("OBSERVATION 3: " + this.me); 

        return this.me 
       }) 
       .catch(this.handleError); 

     } 
    } 

    //Not relevant, just for completeness 
    private handleError(error: any): Promise<any> { 

     console.error('An error occurred', error); // for demo purposes only 
     return Promise.reject(error.message || error); 

    } 
} 

出力コンソールで:ここで

は、サービスコードです。 [オブジェクトオブジェクト]が正しいデータで満たされていることを念頭に置いて、これをチェックして分かりやすくするためにJSON.Stringify()を省略しました。

観測1:不定

観測1:不定

観測2:未定義

観測3:[対象オブジェクト]

観測2:[対象オブジェクト]

観測3:[オブジェクトオブジェクト]

私が考えているのは、httpコールが返される前にAngularコンポーネントがロードされているため、ブートストラップ時に複数のリクエストが発生するということです。これを緩和する正しい、最良の方法は何でしょうか?

答えて

2

リクエスト自体を返し、コンポーネント内で操作を実行してください。約束を使わなければなりませんか?角は観測値を好む。

return this.http.get(this.apiUrl).map(res => res.json()); 

各コンポーネントをサブスクライブします。

+0

これを正解とすると、この実装につながりました。[http://stackoverflow.com/questions/36271899/what-is-the-correct-way-to-share-the-result- of-an-angular-2-http-network-call-in](http://stackoverflow.com/questions/36271899/what-is-the-correct-way-to-share-the-result-of-an -angular-2-http-network-call-in/36291681#36291681) –

0

私はObservablesにヒントを得て、実際に非同期http呼び出しを実装するのが好ましい方法だと思われます。しかし、コンポーネントからの登録だけでは、サービスからAPIへの複数の呼び出しを防ぎませんでしたが、this answerが見つかるまでは動作しませんでした。私はそれがベストプラクティスかどうかはわかりませんが、うまくいきます。

関連する問題