RxJS observable,从第一次发射开始发出先前值和当前值

Sla*_* II 15 observable rxjs

我有一个BehaviorSubject定期发出JavaScript对象.我想构造另一个observable,它将发出底层observable的先前值和当前值,以便比较两个对象并确定delta.

pairwise()bufferCount(2, 1)运营商正在寻找像一个不错的选择,但他们开始发光缓冲区填满后,才,但我需要这个观察到,开始从底层观察到的第一个事件发射.

subject.someBufferingOperator()
    .subscribe([previousValue, currentValue] => {
        /** Do something */
    })
;
Run Code Online (Sandbox Code Playgroud)

在第一次发射时,previousValue可能只是null.

是否有一些内置的操作符可用于实现所需的结果?

Sla*_* II 33

实际上,它就像pairwise()startWith()运营商配对一样简单:

subject
    .startWith(null) // emitting first empty value to fill-in the buffer
    .pairwise()
    .subscribe([previousValue, currentValue] => {
        if (null === previousValue) {
            console.log('Probably first emission...');
        }
    })
;
Run Code Online (Sandbox Code Playgroud)

  • 可爱的解决方案! (5认同)
  • @thorn̈你总是可以手动将可观察到的类型转换为所需的类型,例如 `as Observable<[null | 输入,输入]>`。 (2认同)

TmT*_*ron 12

这是一个简单的运算符:

function withPreviousItem<T>(): OperatorFunction<
  T,
  {
    previous?: T;
    current: T;
  }
> {
  return pipe(
      startWith(undefined),
      pairwise(),
      map(([previous, current]) => ({
        previous,
        current: current!
      }))
    );
}
Run Code Online (Sandbox Code Playgroud)

这样做的好处是结果具有有意义的属性名称和正确的类型:

  • previousT | undefined
  • current不是)TT | null

堆栈闪电战示例