2017-07-13 12 views
0

私の角張ったアプリケーションでは、サーバーからデータをロードするサービスがあります。角度Typescriptコール観察可能な関数once

load.service.ts:

load = new Observable(observer => { 
    console.log('load function called'); 
    // async stuff that takes time 

    observer.complete(); 
}); 

私はまた、すべてがload、観察が完了するまで待つ必要があるコンポーネントの束を持っています。私はこのように、この操作を行います。

this.loadService.load.subscribe(
    change => {}, 
    error => {}, 
() => { 
    // do stuff with data 
    } 
); 

しかし、私はすべてのサブスクライブを複数のコンポーネントを持っている場合は、load関数はconsole.log('load function called');で見られるように(サーバーへの要求の多くを送信し、複数回呼び出される

私の質問私は角度を使用してこの問題を回避する方法があります知っているが、私の質問はこれです

1つのオブザーバブルに複数のサブスクリプションを作成するにはどうすればよいですか?

私の質問はデータのキャッシュに関するものではありません。これは観測値です。

+0

の可能性のある重複した[角度2キャッシュ観察できるHTTP結果データ](https://stackoverflow.com/questions/41554156/angular-2-cache-observable-http-result-data) – jonrsharpe

+0

データのキャッシュについて。それはオブザーバブルについてです – krummens

+0

私の答えを読んでください、私はあなたがそれがあなたの状況にもあてはまると思います。 1つのデータソースに対して複数のサブスクライバが必要ですが、キャッシュと違いはありません。 – jonrsharpe

答えて

1

どのようにオブザーバブルが動作するかを理解する必要があります。 loadが「コールド」の場合は、subscribeごとに新しいシーケンスが開始されることを意味します。

public load(){ 
     if(this.completed){ 
     this.shared = new Observable(...).share(); 
     this.shared.subscribe(()=> this.completed = true); 
     this.completed = false; 
     } 
     return this.shared; 
} 
0

RxJsは()メソッドのシェアを持っている:あなたはそれを「ホット」を作るためにshare演算子を使用して、観察結果をどこかに参照を格納する必要があります。 https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/share.md

ここではこれに別のSOポストの関連です:How to call single ajax request by multiple components parallely in angular2 cli project

希望loadServiceload方法からretuns何を保存し、BehaviourSubjectを購読するBehaviourSubjectを使用しないのはなぜ