根据documentation,缓冲区变换将在发出任何值之前等待延迟。我想要的是立即获得当前值,然后每X秒更新一次。
我还没有用rxjs实现这个目标。我最接近的是绑定observable然后使用setTimeout函数在缓冲区超时发生后重新绑定。这具有在发出当前值之前清除那些X秒的当前值的副作用。
有什么想法吗?
谢谢!
答案 0 :(得分:1)
假设"当前值立即"你的意思是"第一个值一发出",你可以缓冲第二个元素到最后一个,并合并到第一个:
// source$: Observable<T>
const pub_source$ = source$.publish();
Observable.merge(
pub_source$.take(1).map(first => [first]),
pub_source$.skip(1).buffer(Observable.interval(X))
);
pub_source$.connect();
来源需要冷,以便take(1)
和skip(1)
与同一元素相关,因此我们使用publish
。第一个元素也被包装以保持输出类型T[]
一致。
答案 1 :(得分:1)
使用zip操作符的方法比较简单,请参阅learnrxjs
中的灯泡说明结合间隔或计时器,zip可用于从其他来源输出时间!
// Useful for slow source that emits at around the same rate as interval
// but suffers back-pressure with fast-emitting source
const interval = 1000
const output = Observable.zip(source, Observable.timer(0, interval))
.map(x => x[0])
Observable.timer'调节'来自源的输出。注意,timer的第一个参数设置第一次发射的延迟。
工作示例:CodePen
<强>脚注强>
我刚刚意识到,如果你每秒钟有很多事件,这会产生背压(未发射值的积累),所以buffer
是使用快速发射源的更好方法。
// Buffered version for fast source
const output2 = source.buffer(Observable.timer(0, interval))
.filter(x => x.length) // filter out empty buffer emits
.flatMap(x => Observable.from(x)) // optional, converts array back to single emits