RXJS缓冲区转换但立即想要初始值

时间:2017-11-03 14:24:33

标签: rxjs

根据documentation,缓冲区变换将在发出任何值之前等待延迟。我想要的是立即获得当前值,然后每X秒更新一次。

我还没有用rxjs实现这个目标。我最接近的是绑定observable然后使用setTimeout函数在缓冲区超时发生后重新绑定。这具有在发出当前值之前清除那些X秒的当前值的副作用。

有什么想法吗?

谢谢!

2 个答案:

答案 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