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