什么';RxJS运营商之间的区别是什么;“缓冲区”;及;“什么时候?”;?

什么';RxJS运营商之间的区别是什么;“缓冲区”;及;“什么时候?”;?,rxjs,Rxjs,我正在学习Angular和RxJS。读了一本名为《RxJS在行动》的书,我看到两个操作符都提到了。第一个接收并可观察为参数,第二个接收选择器函数。似乎两个缓冲区的内容都基于这些参数 他们之间有什么区别?什么时候应该使用缓冲区而不是bufferWhen运算符?buffer订阅其参数一次,该订阅的每次发射都会向当前缓冲区发出关闭和发射的信号,并重新启动缓冲区 bufferWhen的参数是一个返回可观察值的函数bufferWhen调用它并立即订阅结果,等待发射信号表示其缓冲区关闭。至关重要的是,第一次

我正在学习Angular和RxJS。读了一本名为《RxJS在行动》的书,我看到两个操作符都提到了。第一个接收并可观察为参数,第二个接收选择器函数。似乎两个缓冲区的内容都基于这些参数


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

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

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

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

附录:为了直观显示两者之间的差异,在使用
buffer
实现时查看
buffer非常有用:

const myBufferWhen = fn => buffer(
  defer(fn).pipe(
    take(1),
    repeat()
  )
);