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);