2016-10-04 74 views
3

是否有创建“缓冲区直到改变”功能的好方法?基本上,我有一个像[1,1,1,2,2,2,4,5,5]这样的排序的可观察值,我想创建一个观测值(或任何集合,真的),如[[1,1, 1],[2,2,2],[4],[5,5]]。直到改变RxJS缓冲区

Group by理论上可以在这种情况下工作,但由于它没有立即关闭组observables,所以会在我的应用程序中导致巨大的内存消耗,这是不必要的,因为我知道原始可观察值已排序。

回答

1

的溶液,也可用于直接观测量(rxjs 5):

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

http://jsbin.com/ruyozinali/1/edit?js,console

0

您可以尝试使用bufferWhen加上distinctUntilChanged。是这样的:

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

这导致堆栈溢出时源是'Observable.of([ 1,1,2等)]'。我也尝试过'source.buffer(source.distinctUntilChanged())',但这不起作用,因为它依赖于时间。它可能在一段时间内添加项目时起作用,但我宁愿不依赖于时机(不想竞争条件)。 –