2017-01-18 13 views
3

私はユーザーがお気に入りの投稿のリストをfirebaseに照会する設定をしています。入力observableが空の場合、RxJS-switchMapは値を出力しません配列

基本的には、最初はユーザーの好きな部分をクエリし、次にそれぞれの部分について、対応するポストをすべて1つの観察可能な順序で取得します。

この問題は、ユーザーが左の唯一の投稿を嫌うと発生します。その場合(likes配列が空になる)、observableから何も起動せず、ビューは更新されません(少なくとも1つの投稿が常に存在します)。

一方、この動作は論理的でわかりやすいようですが、他方では、switchMapへの入力が空であってもObservableの最終的な放出方法を確認できません。多分演算子を変更する必要があります。

getUserFavourites(userId = ""):Observable<Post[]> 
{ 
    if (!this.userFavourites$) { 
    this.userFavourites$ = this.af.database.list('/ranks_by_user/' + userId, { 
     query: { 
      limitToFirst: 50 
     } 
     }) //Emits value here (even empty array) 
     .switchMap((likes: any[]) => Observable.combineLatest(
     likes.map(like => this.af.database.object("/posts/" + like.$key).first()) 
    )) //Does not emit new value here if likes array was empty 
     .map(p => { 
     return p.map(cit => Post.unpack(p)); 
     }).publishReplay(1).refCount() 
    } 
    return this.userFavourites$; 
} 
+0

を、私はそれがnullだ好きな配列は、エラーをスローしていることをすべきときだと思いますそれはあなたがキャッチを追加しようとする可能性がチェーンを停止している –

+0

アイデアのおかげで、仲間。それはおそらく動作します。実際に私は試してみましょう:) –

+0

素晴らしいソリューションを発見しました。見てみな。 –

答えて

1

はswitchMap内の条件を追加することによって、問題を解決:

オリジナル - https://github.com/ReactiveX/rxjs/issues/1910

getUserFavourites(userId = ""):Observable<Post[]> 
{ 
    if (!this.userFavourites$) { 
    this.userFavourites$ = this.af.database.list('/ranks_by_user/' + userId, { 
     query: { 
      limitToFirst: 50 
     } 
     }) //Emits value here (even empty array) 
     .switchMap((likes: any[]) => { 
     return likes.length === 0 ? 
     Observable.of(likes) : 
     Observable.combineLatest(
      likes.map(like => this.af.database.object("/citations/" + like.$key)) 
    ) 
    }) //Emits either combined observables array or empty array 
     .map(p => { 
     return p.map(cit => Post.unpack(p)); 
     }).publishReplay(1).refCount() 
    } 
    return this.userFavourites$; 
} 
+0

これは私の命の恩人だった! –

0
.switchMap((likes) => likes.length > 0 ? 
    Observable.combineLatest(
    likes.map(like => this.af.database.object("/posts/" + like.$key).first(): 
    Observable.empty() // if emit empty() then .map() will not run 
) 
.map(...) 
+2

あなたの答えにもう少し説明を加えてください。 – Colwin

+0

siwtchMap()。map()チェーンの場合。 switchMap内で空のObservable(Observable.empty())を返すと、.map()チェーンはトリガーされません。 –

関連する問題