我有一个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)
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)
这样做的好处是结果具有有意义的属性名称和正确的类型:
previous是T | undefinedcurrent不是)TT | null