2016-03-19 19 views
1

私はobservableとobserver(rxjs)の周りに頭を浮かべることができません。私はobservableがobserverにメッセージを送り、observerはobservableを購読できますが、rxjs - observableとobserverを理解する

私はURLを要求したいと言いますが、ユーザーが初めて "loadData"を呼び出し、データがHTTPリクエストからロードされ、クラス内でローカルに保存されたときに、次回ユーザーが "loadData" HTTPからロードしますが、ローカルでデータを取得しますが、同じコード "loadData"を使用したいので、Observerを返す必要があります。

let data = []; 
function loadData():Observer { 
    var observer = new Observer(); 
    if (data.length > 0) { 
     var observable = new Observable.from(data); 
     observable.add(observer); 
     observable.notify(); 
    } else { 
     var observable = this.http.get("data.json"); 
     observable.add(observer); 
     observable.readyData((data) => { 
     this.data = data; 
     observable.notify(); 
     }; 
    } 
} 

var observer = loadData(); 
observer.dataComing((data) => console.log(data)); 

任意のページへの任意の説明やリンクは素晴らしいことだ、私は、フィルタがアレイなどに減らすマップを理解し、また、どのオブザーバーパターンは簡単ですが、ないRXJSの方法は、それは非常に混乱です!

ありがとうございました!観察者がイベントをトリガするために使用され、短いでそれを受信することが観察され

var observe = Observable.create((observer) => { 
    setTimeout(() => { 
    observer.next('some event'); 
    }, 1000); 
}); 

obs.subscribe((event) => { 
    // The event is received here 
}); 

:ここ

+0

新人、顔をしています[observer](https://github.com/ReactiveX/rxjs/blob/master/doc/observer.md)と[observable](https://github.com/ReactiveX/rxjs/blob/)のRxドキュメントを参照してください。 master/doc/observable.md)。それは非常に簡単で包括的です。 – Stanislasdrg

答えて

2

は、観察者のサンプル/観察可能です。ほとんどの場合、オブザーバーは使用されるインターバルです。

:あなたの特にケースを使用して、あなたがこれを使用する可能性があるため

:たとえばここ

Angular2

のHTTPのサポートによっては、反応性、プログラミングに関するいくつかのリンクです
loadData(url:string):Observable { 
    if (this.cachedData) { 
    return Observable.of(this.cachedData); 
    } else { 
    return this.get(...).map(res => res.map()).do((data) => { 
     this.cachedData = data; 
    }); 
    } 
} 

編集

私はこのようにコードをリファクタリングします:あなたのアプリケーションをブートストラップするときLoungesServiceが共有サービスとして定義されなければならないことを

@Injectable() 
export class LoungesService { 
    constructor(private http:Http) { 
    this.loungesByCity = {}; 
    } 

    getLoungesByCity(city:City):Observable<any> { 
    if (this.loungesByCity && this.loungesByCity[city.id]) { 
     return Observable.of(this. loungesByCity[city.id]); 
    } else { 
     return this.http.get("lounges.json") 
      .map(res => <Lounge[]> res.json().data) 
      .map((lounges) => { 
      return lounges.filter((lounge) => lounge.city_id === city.id); 
      }) 
      .do(data => this.loungesByCity[city.id] = data); 
    } 
} 

注:質問に

bootstrap(AppComponent, [ LoungesService ]); 
+0

データが準備されていない場合はどうなりますか? ここをクリックしてください:https://jsbin.com/daxayuwinu/1/edit?js –

+0

私はあなたのコードをこのように更新します。私の更新された回答を参照してください... –

+0

ありがとうございます、ありがとう、コンポーネントを表示するコードを更新しましたが、コンポーネントngOnInitのサブスクライバはデータを取得していません。 –

関連する問題