Rxjs 基于另一个可观测对象的输出对一个可观测对象进行去抖动

Rxjs 基于另一个可观测对象的输出对一个可观测对象进行去抖动,rxjs,ngrx,ngrx-effects,Rxjs,Ngrx,Ngrx Effects,我正在寻找正确的操作符和一种基于另一个对象的输出定时对一个可观测对象进行去抖动的简单方法 基本问题: '如果在过去的3秒钟内,可观察到A已发射,则对可观察到B的发射进行去抖动,直到这3秒钟过去' 此外,这适用于NGRX行动/效果,在这种情况下重新表述基本问题会产生: “根据另一种效果或动作的最新历史记录对某个效果进行去抖动”这应该满足您的要求: const-since=Date.now(); const actionA=新的接收对象(); const actionB=新的接收对象(); con

我正在寻找正确的操作符和一种基于另一个对象的输出定时对一个可观测对象进行去抖动的简单方法

基本问题:

'如果在过去的3秒钟内,可观察到A已发射,则对可观察到B的发射进行去抖动,直到这3秒钟过去'

此外,这适用于NGRX行动/效果,在这种情况下重新表述基本问题会产生:


“根据另一种效果或动作的最新历史记录对某个效果进行去抖动”

这应该满足您的要求:

const-since=Date.now();
const actionA=新的接收对象();
const actionB=新的接收对象();
const debouncedB=Rx.可观测
.联合测试(
动作a.开关映射(()=>Rx.Observable.concat(
Rx.可观察到的(真实),
可观测的接收时间(假)延迟(3000)
))
.startWith(假),
行动B
)
.filter(([debouncing])=>!debouncing)
.map(([,b])=>b)
.distinctUntilChanged();
退订(
(value)=>console.log(value,`T+${((Date.now()-before)/1000).toFixed(0)}`)
);
行动B.下一步(“b1”);
行动A.下一步(“a1”);
行动B.下一步(“b2”);
行动B.下一步(“b3”);
行动B.下一步(“b4”);
setTimeout(()=>actionB.next(“b5”),4000);
setTimeout(()=>actionA.next(“a2”),5000);
setTimeout(()=>actionB.next(“b6”),6000)
。作为控制台包装{最大高度:100%!重要;顶部:0;}

实际上,有一个边缘案例。在至少发出一个动作之前,它不会发出任何东西。这可能是一个问题,也可能是一个问题,但这是需要注意的。修复了它。现在,如果不发出A动作就无关紧要了。一个有用的扩展是将其应用于ngrx效果的情况,但在我看来,当前的答案已经足够了。在
ngrx
上下文中,您需要做的就是将
actionA
替换为
this.actions.ofType(“A”)
,等等。
actions
是您注入到effects类中的
ngrx
actions
可观察到的。仅供参考,我在一个有用的可观察内容库中添加了类似的内容,并注意到它最后需要
distinctunitelChanged
,否则,如果在解除抖动时未接收到任何动作,则会发出陈旧的B动作。