2017-02-12 12 views
1

1つの観測値が実行されると、別の観測から得られるデータに依存しないため、この依存関係を正しく処理する方法を考えることができません。アレイ他のデータに依存している場合に観測値を扱う場合

他の観察可能なAPIからの応答を取得し、idをだすべてのレコードを除外することを意図している加入することによって:観測可能

一つはFirebaseから、それがnovelsReadと呼ばれる単純な数値の配列を作成し、サブスクライブしてデータを取得しますnovelsRead []に存在します。

Firebaseがまだ応答していないため、apiからの応答が返されたとき、novelsRead []はまだ空です。したがって、apiの応答から何もフィルタリングされません。以下

コード:

エクスポートクラスのホームページ{

currentnovels: any; 
novels: any; 
unreadnovels: any; 
nextnovels: any; 
novel: any; 
resultsPageNumber: number = 1; 
novelFullPosterPath: any; 
novelsread: Array<number> = []; 

private basePosterUrlMedium = 'http://image.novels.org/t/p/w500'; 
private basePosterUrlSmall = 'http://image.novels.org/t/p/w185'; 

constructor(private http: Http, 
    private novelsApi: NovelsApiService, 
    private dataService: DataService, 
) { 
    //this takes data from Firebase and pushes it to simple array of ids (numbers) 
    this.dataService.list('novels-read') 
     .subscribe(data => { 
      data.map(results => { 
       this.novelsread.push(results.novelsId); 
      }) 
     }) 
} 


ngAfterViewInit() { 
    this.novelsApi.getnovelsByPage(this.resultsPageNumber) 
    .subscribe(data => { 
     this.novels = data.results; 
     this.novels.map(data => { 

      data.full_poster_path = this.basePosterUrlMedium + data.poster_path; 
      return data; 
     }) 
      .filter(data => { 
       let found = this.novelsread.indexOf(data.id); 
       //It seems when the api responds, this.novelsRead is still empty [] because Firebase has not responded yet 
       console.log("this novelsread[0] is ", this.novelsread[0]); 
       console.log("data.id found is ", found); 
       return data; 
      }) 
    }) 
} 

私は、イベント、または観察可能な鎖またはngAfterViewInitにコンストラクタから関数を移動するなどの他の提案を使っているかどうかをクリーンな解決策を探していますし、逆に。

私はcombineLatestを使ってオブザーバブルを組み合わせるためのコード例を見ましたが、非常に畳み込まれた構文を見つけ出し、イベントを待つことが必要な場合でも、必要なものを取り除くクリーンな方法があるかどうか疑問に思っていました。

答えて

2

forkJoinを使用すると役立ちます。 それは場合にのみ、両方の要求が完了し結果処理することができます: https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/forkjoin.md

やあなたの第二の要求は、第一応答に依存している場合 - switchMap

const request1$ = Rx.Observable.of('response1').delay(2000); 
 
const request2$ = Rx.Observable.of('response2').delay(100); 
 

 
Rx.Observable.forkJoin(request1$, request2$) 
 
    .subscribe(res => console.log(`forkJoin: ${res}`)); 
 

 
request1$.switchMap(res1 => { 
 
    console.log(`switchMap: ${res1}`); 
 
    return request2$; 
 
}).subscribe(res2 => console.log(`switchMap: ${res2}`));
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>

+0

を使用していただきありがとうございます。正確に私が必要としたもの。 –

関連する問題