我有一个可观察到的Subject
,它通过去抖动发出一些变化:
someSubject.pipe(
debounceTime(5000),
).subscribe(response => {
console.log('Value is', response);
})
现在,我需要一个Stop
按钮在屏幕上的某个地方,它可以取消我的反发射。所以我创建了一个按钮:
const stopObs = new Subject();
...
<button onClick={() => stopObs.next()}>Stop</button>
并像这样修改我的订阅:
someSubject.pipe(
debounceTime(5000),
takeUntil(stopObs),
).subscribe(response => {
console.log('Value is', response);
})
这可以很好地工作,在点击“停止”后,我停止在控制台中获取值,但有一个问题:观察值永远停止。我需要它能够发出新的值,我只需要取消已经开始解除发射。
我的第一个想法是创建一个新的主题并使用repeatWhen
const startObs = new Subject();
...
<button onClick={() => startObs.next()}>Start</button>
...
someSubject.pipe(
debounceTime(5000),
takeUntil(stopObs),
repeatWhen(() => startObs)
).subscribe(response => {
console.log('Value is', response);
})
但还有另一个问题:如果我多次点击" start“按钮,并向startObs
发出多个值,那么我开始为单个去抖动的值获取多个console.log
!
那么,有没有一种方法可以在不停止整个观察点的情况下,只取消去抖动的发射呢?
发布于 2020-11-07 21:26:32
由于debounceTime
只是
const duration = timer(dueTime, scheduler);
return debounce(() => duration);
我认为你可以这样解决这个问题:
someSubject.pipe(
debounce(() => timer(5000).pipe(takeUntil(stopObs))),
)
如果你想在计时器由于stopObs
而被取消时发送最后一个值,你可以尝试这样做:
someSubject.pipe(
debounce(
() => timer(5000)
.pipe(
takeUntil(stopObs),
isEmpty(),
)
),
)
isEmpty()
将在complete
通知之前立即发出true
,这是debounce
发送最后接收的值所需的。如果计时器在没有stopObs
参与的情况下完成,isEmpty
将发出false
而不是true
,但这仍然适用于debounce
,因为它只需要来自内部可观察对象的值。
https://stackoverflow.com/questions/64729001
复制相似问题