如何从可观察数据流中发出单个数组?

时间:2017-08-23 21:37:18

标签: angular rxjs ngrx

我在角度4项目中使用NGRX平台。我正在使用RXJS +5。

在初始化组件时,我从我的商店中选择一个对象数组。我希望每次数据在我的商店中发生变化时,这个observable都会发出一个数组。

我正在解压缩数组,但是将可观察数据流打包回一个发出一次的数组就会给我带来麻烦。

我想执行以下操作,但这永远不会发出值,因为订阅永远不会完成。据我所知,toArray仅在完成时发出。

 this.addedProducts$ = this._store.select(s=>s.order.selectedProducts)
      .flatMap(prods=>prods) //emits an observable for each product in store
      .map(prod=>prod._id) //returns the id for each product
      .toArray(); // I would like this to be an Observable<string[]>

相反,我做了类似的事情:

this.addedProducts$ = this._store.select(s=>s.order.selectedProducts)
  .flatMap(prods=>prods)
  .map(prod=>prod._id)
  .scan((acc, value) => {
    acc.push(value);
    return acc;
  }, [])

但是这会在向数组添加_id的每一次迭代中发出一个新数组。我希望这个observable发出一个包含其中所有值的数组。

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:0)

这个解决方案并不适合我,但它确实完成了我想要的。我愿意听取不同的方法。

this.addedProducts$ = this._store.select(s=>s.order.selectedProducts)
  .map(prods=>{return prods.map((prod)=>prod._id)}); 

答案 1 :(得分:0)

我认为值与时间和当前值之间存在误解。

请让我知道,但我认为这个解决方案已经足够了:

this.addedProducts$ = this
  ._store
  .select(s=>s.order.selectedProducts)
  .map(prods =>
    prods.map(prod => prod._id)
  );

第一个mapObservable中的一个,第二个只是您可以在任何数组上使用的javascript map

所以最后,每次s.order.selectedProducts更改时,您都会获得一个包含这些产品的所有ID的新数组。

也就是说,您可能希望使用选择器而不是在应用中的任何位置执行此操作:

// in some selector file, for example `products.selectors.ts`
const getSelectedProductsIds => state => state.order.selectedProducts.map(prod => prod._id);

// in every component, effect, whatever where you need to access the selected products IDs
this.addedProducts$ = this._store.select(getSelectedProductsIds);