Как создать Observable, который зависит от другого Observable в RxJS - PullRequest
1 голос
/ 08 мая 2020

У меня есть служба корзины, которая предоставляет реактивные данные о корзине:

export interface OrderItem {
  product: IProduct
  quantity: number
}

private subject = new BehaviorSubject<OrderItem[]>([])
private orderItems: Observable<OrderItem[]> = this.subject.asObservable()

getItems(): Observable<OrderItem[]> {
    return this.orderItems
  }

Я хочу создать метод, который будет возвращать Observable количества продуктов в корзине , вот так (псевдокод):

return getItems().subscribe(items => {
  let cartSize = 0
  items.forEach(item => cartSize += item.quantity)
})

Итак, в основном, чтобы вернуть cartSize как наблюдаемое, как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Это не наблюдаемое в зависимости от другого наблюдаемого (которое будет вызывать такие операторы, как, например, mergeMap, switchMap и withLatestFrom), но это просто преобразование вашего наблюдаемого. Это будет карта.

Например:

const totalQuantity$ = getItems().pipe(
  map(items => {
    // this would be nicer using a reduce but ok
    let cartSize = 0
    items.forEach(item => cartSize += item.quantity)
    return cartSize
   })
 )

А затем подпишитесь где-нибудь на totalQuantity $.

0 голосов
/ 09 мая 2020

Не имеет отношения, но вы можете удалить это свойство orderItems и реорганизовать метод getItems на:

getItems(): Observable<OrderItem[]> {
  return this.subject.asObservable()
}

В любом случае, если вы используете некоторые операторы канала в этом методе, вы просто можете работать с this.subject, потому что все каналы возвращают Observable

...