【问题标题】:BufferCount(2, 1) with first emission in rxjsrxjs 中第一次发射的 BufferCount(2, 1)
【发布时间】:2017-12-21 20:13:33
【问题描述】:

我有一个 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---|

我的问题是在这种情况下省略了第一次发射。 我尝试使用 buffer() insted of bufferCount() 和以下closureNotifier:

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) 但无论如何都会发射源 observable 的第一次发射?

【问题讨论】:

  • .startWith(undefined).bufferCount(2, 1)
  • 谢谢@cartant,帮了大忙!

标签: rxjs observable reactive-programming


【解决方案1】:

如果您的要求如下:

给定一个值流:

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

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

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

您可以使用.distinctUntilChanged() 来获得这种行为:

public distinctUntilChanged(compare: function): Observable source

返回一个 Observable,它发出源发出的所有项目 通过比较与前一项不同的 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>

【讨论】:

  • 我过分简化了我的问题,我的 observable 发出的对象如果不是指相同的东西,它们总是不同的。
  • @JarosławRewers distinctUntilChanged 将比较器函数作为参数:obs.distinctUntilChanged((a,b)=>_.isEqual(a,b))(使用 lodash)。
  • 不知道这一点。谢谢你,@n00dl3!
猜你喜欢
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多