3

以前我使用 rxjs-5 并且我使用 observable.partition 如下:

const [isTiming$, isNotTiming$] = this.store.select(state => state.tetris.isTiming)
        .partition(value => value);

升级angular8 rxjs升级后rxjs-6开始抛出以下错误:

 providers/timer.provider.ts(27,5): error TS2339: Property 'partition' does not exist on type 'Observable<boolean>'.

当我检查较旧的 rxjs 实现时,它的实现如下:

  import { Observable } from '../Observable';
  import { partition as higherOrder } from '../operators/partition';
  /**
   * Splits the source Observable into two, one with values that satisfy a
   * predicate, and another with values that don't satisfy the predicate.
   */
   export function partition<T>(this: Observable<T>, predicate: (value: T, index: number) => boolean, thisArg?: any): [Observable<T>, Observable<T>] {
    return higherOrder(predicate, thisArg)(this);
  }
4

2 回答 2

3

看到github转换后

我认为我们应该弃用分区运算符并将其删除以用于 v7。

原因:

  • 不是真正的运算符:partition 并不是真正的“运算符”,因为它返回 [Observable, Observable] 而不是 Observable。这意味着它不像其他人那样通过管道组成。

  • 易于更换过滤器:分区可轻松更换为广为人知的过滤器操作符。由于分区实际上与以下内容相同:const partition = (predicate) => [source.pipe(filter(predicate)), source.pipe(filter((x, i) => !predicate(x, i)))]

在你的情况下:

import {filter} = "rxjs/operators"
const source = this.store.select(state => state.tetris.isTiming);
const partition = (predicate) => [source.pipe(filter(predicate)), source.pipe(filter((x, i) => !predicate(x, i)))]

const [isTiming$, isNotTiming$] = partition(value => value);
  • 很少使用:在我进行的任何代码调查中都很少使用(在我知道使用 RxJS 的数千行代码中)
于 2019-06-15T09:52:50.630 回答
2

我邀请您使用 Observable 方法pipe,如下所示:

const [isTiming$, isNotTiming$] = this.store.select(state => state.tetris.isTiming)
        .pipe(
            partition(value => value);
        )
于 2019-06-15T09:52:58.960 回答