2017-06-15 6 views
1

私はこの記事を読んでいるので、Querying a Normalized State with RxJS in Angularのように自分のセレクタをマージしています。 グループプロパティに基づいてオブジェクトのリスト::オブジェクト[]マップ[] []オブジェクトにしかし、私は...rxjsフローとngrxセレクタの問題

GOALそれらのいずれかで問題があります。

シンプルなケース:

const a = [ 
 
    {a:2, b:'d'}, 
 
    {a:2, b:'e'}, 
 
    {a:3, b:'f'}, 
 
    {a:1, b:'b'}, 
 
    {a:1, b:'c'}, 
 
]; 
 

 
const a$ = Rx.Observable.of(a); 
 

 
a$ 
 
    .switchMap(items => Rx.Observable.from(items)) 
 
    .groupBy(item => item.a) 
 
    .mergeMap(group => group.toArray()) 
 
    .toArray() 
 
    .subscribe(console.log)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.4.1/Rx.min.js"></script>

しかし、観測可能なソースはngrxセレクタによって提供されている場合、私はそれがmergeMap演算子を渡しません...何も結果を持っていません。

products$: Observable<Product[]> = this._store.select(state => state.product.products); 

this.products$ 
    .switchMap(products => Observable.from(products)) 
    .groupBy(product => product.productGroup.id) 
    .mergeMap(group => group.toArray()) 
    .toArray() 
    .subscribe(console.log) 

前に再選択して、それが働いていた:

export const getProductGroups = createSelector(getProducts, (products) => { 
    let productGroups: Product[][] = []; 
    Observable.from(products) 
    .groupBy(product => product.productGroup.id) 
    .mergeMap(group => group.toArray()) 
    .toArray() 
    .subscribe(pgs => productGroups = pgs); 
    return productGroups; 
}); 

なぜ誰かが知っていますか?

+0

は、なぜあなたは先頭に 'switchMap'が必要なのでしょうか?なぜあなたは別の観測の内容から新しい観測を再現したいのですか?私はあなたがちょうどこの行を削除することができるように感じ、私は間違っていますか? – atomrc

答えて

2

ngrxストアのselectは完了しません。 toArrayは、ソースを観測する前に観測可能な観測を完了する必要があります。

first()またはtake(1)を、店舗から構成された観測可能物に含めると、期待している結果が表示されます。

また、あなたはこのように、switchMapgroupByなどを移動することができます:

products$: Observable<Product[]> = this._store.select(state => state.product.products); 

this.products$.switchMap(products => Observable 
    .from(products) 
    .groupBy(product => product.productGroup.id) 
    .mergeMap(group => group.toArray()) 
    .toArray() 
) 
.subscribe(console.log)