2017-03-08 10 views
0

に加入したとき、私はAPIからいくつかのデータを返すサービスがあります。私のコンポーネントで、私はので、後で使用するために変数に返され、観察を格納したい実行何かのhttp観察できるが

// ... 

getMetadata() { 
    this.spinner.start(); 
    return this.http.get('/api/metadata').finally(() => this.spinner.stop()); 
} 

// .... 

をI

// ... 
this.metadata$ = this.api.getMetadata(); 
// ... 

をとの私は| asyncを使用して、私のテンプレートでは、この観測可能などこかを使用しているとしましょう、しかし、のは、これはすぐには起こらないとしましょう:行きます。 私のスピナーは、サブスクリプションがまったく配置されていない場合でも、とにかく表示されます。

私の質問は、finallyのような最初のサブスクリプション時に関数を呼び出すオブザーバブルを定義する方法ですが、オブザーバブルが最初に(または毎回)サブスクライブされているときに正確に何かを実行するためですに?

ありがとうございます!スピンナーで

getMetadata() { 

    return Observable.of(this.spinner.start()). 
      flatMap(()=> this.http.get('/api/metadata')). 
      finally(() => this.spinner.stop()); 
} 

スタートに観測をして、flatMapにリクエストを送信し、最終的にスピナーを閉じる:

+0

"サブスクリプションが全く配置されていませんでした" ..あなたはそれがエラーになるか、またはリクエストが行かないことを意味しますか? –

+0

いいえ、私はちょうどその上に 'サブスクライブ 'と呼ばれる誰もいないことを意味します。 – Amit

+0

私がちょうどそれを購読せずに観測可能性を「要求」した場合にスピナーを表示するので、観察可能なものを購読していなくてもあまり意味がありません – Amit

答えて

0
constructor(private _service:YourService) {} 
ngOnInit() { 
    this._service.getMetadata().subscribe(
     (items)=>{ 
     this.metadata$=items,console.log(groups) 
     }, 
     err => console.log(err) 
    ); 
} 
+0

私はデータを遅延させたいので、使用されていなければ検索したくないので、 'async'パイプを使用します。 – Amit

0

あなたは試みることができます。

+0

最初の行に作成するobservableは' this'の戻り値の 'of'になります。 spinner.start() '、それはobservableが購読されたときにそれを呼び出すことはありませんが、その戻り値(私の場合は定義されていません)を返すだけです – Amit

+0

これは要求値を返します..最初のobservableはflatmap..orに行きますconcatMapを使用する –

+0

いいえ、 'getMetadata'関数が呼び出されると、' this.spinner.start() 'が直ちに呼び出されます。これは私が達成しようとしているものではありません。 – Amit

関連する問題