2017-06-15 27 views
1

因爲我讀了這篇文章:Querying a Normalized State with RxJS in Angular,我正在合併我的選擇器到他的方式。但我有一個問題與其中之一..問題與rxjs流和ngrx選擇器

目標: 根據屬性對象列表:Object []映射到對象[] []。

簡單的情形:

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),則應該會看到預期的結果。

或者,你可以移動groupBy等進入switchMap,就像這樣:

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)