合并嵌套可观察对象的结果

Combine results of nested observables

我在网上商店工作,我想检查商品是否已经在购物车中。我有两个需要完成这项工作的可观察对象:

1: 从数据库中取出所有项目

this.itemsService
  .getAll()
  .subscribe(
    items => {
      console.log(items); // [{...},{...},{...},...]
    }
  );

2:如果一个项目在购物车中出现了三次,这个函数将返回一个包含该项目三倍的数组的可观察对象。

public getItemFromCart(itemToGet) {
  return this.cart$.map(cartItems => {
    return cartItems.filter(
      (item: ICartItem) => itemToGet.id === item.idItem
    );
  });
}

我现在想做的是获取所有商品,使用 getItemFromCart 检查每个商品是否存在于购物车中,如果存在,我需要设置 属性 item.inCart = true。否则应该是假的...

我只想使用一个订阅,不想嵌套订阅...

this.itemsService
  .getAll()
  // do something here to check if the item in the array is present in the cart
  .subscribe(
    items => {
      console.log(items); // [{...},{...},{...},...]
    }
  );

提前致谢!

因为您同时拥有 items$cart$,您可能可以使用 combineLatestzip 运算符,请执行以下操作:

import { of } from 'rxjs/observable/of';
import { zip } from 'rxjs/observable/zip';   
import { combineLatest } from 'rxjs/observable/combineLatest';

// replace with your item service stream
const items$ = of([
  { id: 1, name: 'a' },
  { id: 2, name: 'b' },
  { id: 3, name: 'c' },
  { id: 4, name: 'd' },
  { id: 5, name: 'e' }
]);

// replace with your cart stream
const cart$ = of([
  { id: 1, name: 'a' },
  { id: 2, name: 'b' },
  { id: 3, name: 'c' }
]);

let result = [];
// use zip or combineLatest
combineLatest(items$, cart$)
  .subscribe(([items, cartItem]) => {
    result = items.map(item => ({
      ...item,
      inCart: !!cartItem.find(x => x.id === item.id)
    }));

    // 1, 2, 3 incart = true, 4, 5 incart = false
    console.log(result);
  });