我正在寻找合适的运算符和一种优雅的方法来根据另一个的输出时间来去抖动一个可观察的。
基本问题:
'如果在过去 3 秒内可观察到的 A 已发射,则对可观察到 B 的发射进行去抖动处理,直到这三秒过去'
此外,这适用于 NGRX 动作/效果的上下文中,在此上下文中重新表述基本问题会产生:
'根据另一个效果或动作的最近历史来消除效果'
我正在寻找合适的运算符和一种优雅的方法来根据另一个的输出时间来去抖动一个可观察的。
基本问题:
'如果在过去 3 秒内可观察到的 A 已发射,则对可观察到 B 的发射进行去抖动处理,直到这三秒过去'
此外,这适用于 NGRX 动作/效果的上下文中,在此上下文中重新表述基本问题会产生:
'根据另一个效果或动作的最近历史来消除效果'
这应该做你所追求的:
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
用于如果在信号为 时接收到另一个 A 动作true
,则信号不会设置为false
直到最后一个 A 动作之后的三秒。