RxJS缓冲区,直到更改

RxJS缓冲区,直到更改,rxjs,Rxjs,有没有一种很好的方法来创建一个“缓冲区直到改变”函数?基本上,我有一个像[1,1,1,2,2,2,4,5,5]这样的排序可观察对象,我想创建一个可观察对象的可观察对象(或任何集合,真的)像[[1,1,1],[2,2,2],[4],[5,5] groupBy理论上可以在这种情况下工作,但它会在我的应用程序中造成巨大的内存消耗,因为它没有立即关闭组观察对象,这是不必要的,因为我知道原始观察对象已排序。您可以尝试使用bufferWhen与distinctUntilChanged组合使用bufferWh

有没有一种很好的方法来创建一个“缓冲区直到改变”函数?基本上,我有一个像
[1,1,1,2,2,2,4,5,5]
这样的排序可观察对象,我想创建一个可观察对象的可观察对象(或任何集合,真的)像[
[1,1,1],[2,2,2],[4],[5,5]


groupBy
理论上可以在这种情况下工作,但它会在我的应用程序中造成巨大的内存消耗,因为它没有立即关闭组观察对象,这是不必要的,因为我知道原始观察对象已排序。

您可以尝试使用
bufferWhen
distinctUntilChanged
组合使用
bufferWhen。大概是这样的:

source.bufferWhen(() => source.distinctUntilChanged())

也适用于即时观测的解决方案(rxjs 5):


当源是([1,1,2等])的
可观察时,这会导致堆栈溢出。
。我还尝试了
source.buffer(source.distinctUntilChanged())
,但这也不起作用,因为它依赖于时间。当在一段时间间隔内添加项目时,它可能会起作用,但我不希望依赖于时间(不希望出现争用条件)。堆栈溢出可能是由于可观察对象是冷的这一事实造成的。您可能需要多播源代码?我正在RxJava中寻找类似的源代码。您有解决方案的RxJava版本吗
source
  .concat(Observable.of('~'))
  .scan(({ buffer }, item) => buffer.length === 0 || buffer.includes(item) ? 
        ({ buffer: [...buffer, item] }) : 
        ({ buffer: [item], output: buffer }), { buffer: [] })
  .pluck('output')
  .filter(x => x);