RxJS 运算符“buffer”和“bufferWhen”之间有什么区别?

asd*_*van 4 rxjs

我正在学习 Angular 和 RxJS。在读一本名为《RxJS in action》的书时,我看到提到了这两个运算符。第一个接收和 observable 作为参数,第二个接收选择器函数。看来两者都基于这些参数来缓冲内容。

他们之间有什么区别?我什么时候应该使用缓冲区而不是bufferWhen运算符?

bac*_*ick 5

buffer订阅其参数一次,该订阅的每次发射都会向当前缓冲区发出关闭和发射信号,从而重新启动缓冲区。

的参数bufferWhen是一个返回可观察值的函数。bufferWhen调用它并立即订阅结果,等待发出信号以指示其缓冲区关闭。至关重要的是,第一次发射将是唯一重要的,因为在该事件发生时,缓冲区关闭,对信号可观察值的订阅结束,并且重复本段中的步骤,直到我们正在缓冲的可观察值完成。

这什么时候有用?有时,在缓冲可观察量时,您可能需要进行一些设置,然后才能在正确的时间发出信号。此设置可能涉及生成一些初始值,可能基于当前的“世界状态”,或者随机生成。截至撰写本文时,Rx 文档描述bufferWhen了一个在计时器上进行缓冲的示例,该计时器每次持续不同的随机持续时间。

附录:为了可视化两者之间的差异,查看bufferWhen使用以下实现是很有用的buffer

const myBufferWhen = fn => buffer(
  defer(fn).pipe(
    take(1),
    repeat()
  )
);
Run Code Online (Sandbox Code Playgroud)