【问题标题】:RXJS: Aggregated debounceRXJS:聚合去抖动
【发布时间】:2016-03-01 10:23:46
【问题描述】:

我的用例如下:我收到事件,有时会突然发生。如果发生突发,我只需要处理一次。 Debounce 就是这样做的。

但是,去抖动只给了我一个爆发的最后一个元素,但我需要知道一个爆发中的所有元素才能聚合它们(使用平面图)。

这可以通过定时窗口或缓冲区来完成,但是,这些是固定间隔,因此缓冲区/窗口超时可能发生在突发中间,因此将突发分成 2 部分来处理而不是 1。

所以我想要的是类似的东西

.
.
event: a
.
. -> a
.
.
.
.
.
.event: b
.event: c
.event: d
.
.-> b,c,d
. 
.
.
.
.event : e
.
. -> e
.

【问题讨论】:

  • 您的问题解决了吗?
  • @user3743222 Matt burnell 的回答对我有用。

标签: rxjs reactivex


【解决方案1】:

这可以通过buffer 来实现,方法是将去抖动的流作为关闭选择器传入,例如:

var s = Rx.Observable.of('a')
  .merge(Rx.Observable.of('b').delay(100))
  .merge(Rx.Observable.of('c').delay(150))
  .merge(Rx.Observable.of('d').delay(200))
  .merge(Rx.Observable.of('e').delay(300))
  .share()
;

s.buffer(s.debounce(75)).subscribe(x => console.log(x));

这是一个可运行的版本:https://jsbin.com/wusasi/edit?js,console,output

【讨论】:

【解决方案2】:

您可能正在寻找bufferWithTimeOrCount

来自页面:

/* Hitting the count buffer first */
var source = Rx.Observable.interval(100)
    .bufferWithTimeOrCount(500, 3)
    .take(3);

var subscription = source.subscribe(
    function (x) {
        console.log('Next: ' + x.toString());
    },
    function (err) {
        console.log('Error: ' + err);
    },
    function () {
        console.log('Completed');
    });

// => Next: 0,1,2
// => Next: 3,4,5
// => Next: 6,7,8
// => Completed

【讨论】:

  • 不,带计数的缓冲区有不同的作用,在我最初的帖子中,我解释了为什么缓冲区不起作用,如果你用时间、计数或两者来缓冲也是一样的。简而言之:缓冲区(和每个变体)可以在突发的中间发出 observables。这与 debounce 不同,debounce 只会在没有传入事件的一段时间后发出。
猜你喜欢
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 2021-02-20
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多