我正在寻找合适的算子,并根据另一个的输出时序去抖动一个observable。
基本问题:
'如果在过去的3秒内观察到A已经发射,则去掉Observable B的发射直到这三秒钟过去了“
另外,这是在NGRX动作/效果的上下文中应用,在此上下文中重新描述基本问题:
'根据最近的另一种效果或行动的历史辩护效果'
答案 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动作转换为可以true
或false
的去抖动信号。当true
时,B动作将被消除,直到信号变为false
。
switchMap
,如果在信号为true
时收到另一个A动作,则信号将不会设置为false
,直到最后A动作后的三秒钟。< / p>