根据另一个可观察量的输出对一个Observable进行去抖动

时间:2017-05-30 06:48:50

标签: rxjs ngrx ngrx-effects

我正在寻找合适的算子,并根据另一个的输出时序去抖动一个observable。

基本问题:

'如果在过去的3秒内观察到A已经发射,则去掉Observable B的发射直到这三秒钟过去了“

另外,这是在NGRX动作/效果的上下文中应用,在此上下文中重新描述基本问题:

'根据最近的另一种效果或行动的历史辩护效果'

1 个答案:

答案 0 :(得分:1)

这应该做你想做的事情:

const since = Date.now();

const actionA = new Rx.Subject();
const actionB = new Rx.Subject();

const debouncedB = Rx.Observable
  .combineLatest(
    actionA.switchMap(() => Rx.Observable.concat(
      Rx.Observable.of(true),
      Rx.Observable.of(false).delay(3000)
    ))
    .startWith(false),
    actionB
  )
  .filter(([debouncing]) => !debouncing)
  .map(([, b]) => b)
  .distinctUntilChanged();

debouncedB.subscribe(
  (value) => console.log(value, `T+${((Date.now() - since) / 1000).toFixed(0)}`)
);

actionB.next("b1");
actionA.next("a1");
actionB.next("b2");
actionB.next("b3");
actionB.next("b4");

setTimeout(() => actionB.next("b5"), 4000);
setTimeout(() => actionA.next("a2"), 5000);
setTimeout(() => actionB.next("b6"), 6000);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://unpkg.com/rxjs@5/bundles/Rx.min.js"></script>

它将每个A动作转换为可以truefalse的去抖动信号。当true时,B动作将被消除,直到信号变为false

使用

switchMap,如果在信号为true时收到另一个A动作,则信号将不会设置为false,直到最后A动作后的三秒钟。< / p>