Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获得对可观察数据的即时访问_Javascript_Angular_Redux_Rxjs_Observable - Fatal编程技术网

Javascript 获得对可观察数据的即时访问

Javascript 获得对可观察数据的即时访问,javascript,angular,redux,rxjs,observable,Javascript,Angular,Redux,Rxjs,Observable,我使用Angular、ngrx/store和rxjs 因此,我有一个购物车减速机和一个物品减速机。 当我从API获取项目时,我需要知道它们是否已经在购物车中 因此,由于我已经实现了分页,所以我认为最好的方法是在实际的服务中检查它,以获取项目,并在项目对象内创建一个化身字段 我不想在subscribe中执行此操作,因为当我获取项目时,我没有更改购物车状态,因此永远不会调用subscribe。如果我用地图 我也无法访问服务中的数据 所以我真的不确定如何以“最佳实践方式”做到这一点 也许我也可以用一种

我使用Angular、ngrx/store和rxjs

因此,我有一个购物车减速机和一个物品减速机。

当我从API获取项目时,我需要知道它们是否已经在购物车中

因此,由于我已经实现了分页,所以我认为最好的方法是在实际的服务中检查它,以获取项目,并在项目对象内创建一个化身字段

我不想在subscribe中执行此操作,因为当我获取项目时,我没有更改购物车状态,因此永远不会调用subscribe。如果我用地图 我也无法访问服务中的数据

所以我真的不确定如何以“最佳实践方式”做到这一点

也许我也可以用一种旧的方式将Cart对象保存在Cart服务中,但我认为这不是最好的做法

下面的代码将是我理想的案例场景。(但ofc这不起作用,因为我无法使用pulkmap访问购物车对象)

getItems():可观察{
返回此.http.get(url)
.map(此.extractData)
.map(此.extractItemlist)
.接住(这个.把手错误)
}
私有extractItemlist(res:ApiResponse){
开关(res.response.type){
案例ApiResponse.TYPE.ERROR:
抛出res.response.data.message
案例ApiResponse.TYPE.SUCCESS:
this.checkIfItemsAreInCart(res.response.data.list)
返回res.response.data.list
}
}
私人checkIfItemsAreInCart(项目:项目[]){
const cart=this.store.select('cart')。pull('cart'))
用于(项目的常数项){
用于(购物车项目的const cartItem){
if(item.details.item_id===+cartItem.item_id){
item.t=true
}否则{
item.t=false
}
}
}
}
有人知道如何做到这一点吗?我是一个新的观察到的东西,所以可能这就是为什么我仍然没有想出一个好的解决方案

我真的很感谢你的帮助

我不想在subscribe中执行此操作,因为当我获取项目时,我没有更改购物车状态,因此永远不会调用subscribe

Observable的Subscribe将在您第一次调用时调用,因此它不需要“更改”

private checkIfItemsAreInCart(项目:项目[]){
this.store.select('cart')
.采取(1)
.订阅(购物车=>{
用于(项目的常数项){
用于(购物车项目的const cartItem){
if(item.details.item_id===+cartItem.item_id){
item.t=true
}否则{
item.t=false
}
}
}
});
}

最佳做法是不要使用
弹拨
,也不要将字符串传递给
选择
;看见关于对商店的同步访问,请参见。@Frederico Jesus:如果它符合您的要求,请标记它是正确的答案,tks。您也可以使用
。take(1)
,而不是在第一项之后取消订阅
getItems(): Observable<Item[]> {
  return this.http.get(url)
    .map(this.extractData)
    .map(this.extractItemlist)
    .catch(this.handleError)
}

private extractItemlist(res: ApiResponse) {
  switch (res.response.type) {
    case ApiResponse.TYPE.ERROR:
      throw res.response.data.message
    case ApiResponse.TYPE.SUCCESS:
      this.checkIfItemsAreInCart(res.response.data.list)
      return res.response.data.list
  }
}

private checkIfItemsAreInCart(items: Item[]) {
  const cart = this.store.select<CartState>('cart').pluck('cart')

  for (const item of items) {
    for (const cartItem of cart.items) {
      if (item.details.item_id === +cartItem.item_id) {
        item.inCart = true
      } else {
        item.inCart = false
      }
    }
  }
}
private checkIfItemsAreInCart(items: Item[]) {
  this.store.select<CartState>('cart')
    .take(1)
    .subscribe(cart => {
      for (const item of items) {
         for (const cartItem of cart.items) {
           if (item.details.item_id === +cartItem.item_id) {
             item.inCart = true
           } else {
             item.inCart = false
           }
         }
       }
  });
}