BufferCount(2,1),在rxjs中首次发射

时间:2017-12-21 09:53:46

标签: rxjs observable reactive-programming

我有一个Observable:

1----2----3----3----2----1-|

我用

.bufferCount(2, 1)

,输出

--[1,2]-[2,3]-[3,3]-[3,2]-[2,1]-|

然后我链

.filter(twoEmissions => twoEmissions[0] !== twoEmissions[1])

这使得:

 --[1,2]-[2,3]-------[3,2]-[2,1]-|

然后我链

.map(twoEmissions => twoEmissions[1])

只留下最新的排放,所以我的最终输出是:

-----2-----3------------2----1---|

我的问题是在这种情况下,第一次发射被忽略了。 我尝试使用bufferCt()的buffer()以及closingNotifier:

bufferClosingNotifier = sourceObservable$
  .scan((acc, val, index) => (index), 0)
  .filter((index: number) => index === 0 || index > 0 && index % 2 !== 0)

它排放第1次,第3次,第5次,第7次......但它们没有重叠。

我怎样才能拥有bufferCount(2,1),但无论如何都会发出第一次源可观察的发射?

1 个答案:

答案 0 :(得分:3)

如果您的要求如下:

给定一组价值观:

1----2----3----3----2----1-|

我只想要成功的唯一值,以便结束流

1----2----3---------2----1-|

您可以使用.distinctUntilChanged()来解决此问题:

  

public distinctUntilChanged(compare: function): Observable source

     

返回一个Observable,它发出源发出的所有项目   与前一项相比较具有明显的可观察性。

     

如果提供了比较器功能,则会为每个功能调用它   用于测试是否应该发出该值的项目。

     

如果未提供比较器功能,则使用等式检查   默认值。

Rx.Observable.from([1,2,3,3,2,1])
  .distinctUntilChanged()
  .subscribe(val => console.log(val))
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.5/Rx.js"></script>