rxjs:取消去抖动的可观测
我有一个可观察的rxjs:取消去抖动的可观测,rxjs,Rxjs,我有一个可观察的主题,它随着去抖动而发出一些变化: someSubject.pipe( debounceTime(5000), ).subscribe(response => { console.log('Value is', response); }) 现在,我需要一个停止按钮在屏幕上的某个地方,它将取消我的去抖动发射。所以我创建了一个按钮: const stopObs = new Subject(); ... <button onClick={() => stop
主题
,它随着去抖动而发出一些变化:
someSubject.pipe(
debounceTime(5000),
).subscribe(response => {
console.log('Value is', response);
})
现在,我需要一个停止
按钮在屏幕上的某个地方,它将取消我的去抖动发射。所以我创建了一个按钮:
const stopObs = new Subject();
...
<button onClick={() => stopObs.next()}>Stop</button>
这很好,在点击“停止”后,我停止在控制台中获取值,但有一个问题:可观察对象永远停止。我需要它能够发射新的值,我只需要取消已经开始的去抖动发射
我的第一个想法是创建一个新主题,并使用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);
})
const startObs=新主题();
...
startObs.next()}>Start
...
烟斗(
去BounceTime(5000),
takeUntil(stopObs),
重复时间(()=>startObs)
).订阅(响应=>{
log('值为',响应);
})
但还有另一个问题:如果我多次点击“开始”按钮,并向startObs
发出多个值,那么我将开始获得多个控制台。对于单个取消公告的值,记录
那么,有没有一种方法可以在不停止整个可见光的情况下仅取消去抖动发射?因为它只是
const duration=计时器(dueTime,调度程序);
返回去盎司(()=>持续时间);
我想你可以这样解决这个问题:
someSubject.pipe(
去抖动(()=>计时器(5000).管道(takeUntil(stopObs)),
)
如果您想在计时器因stopObs
而取消时发送最后一个值,可以尝试以下操作:
someSubject.pipe(
去盎司(
()=>定时器(5000)
.烟斗(
takeUntil(stopObs),
isEmpty(),
)
),
)
将在完成
通知之前立即发出true
,这是debounce
发送上次接收的值所需的。如果计时器在没有stopObs
参与的情况下完成,isEmpty
将发出false
而不是true
,但这仍然适用于debounce
,因为它只需要来自内部可观测值的值。
const duration=计时器(dueTime,调度程序);
返回去盎司(()=>持续时间);
我想你可以这样解决这个问题:
someSubject.pipe(
去抖动(()=>计时器(5000).管道(takeUntil(stopObs)),
)
如果您想在计时器因stopObs
而取消时发送最后一个值,可以尝试以下操作:
someSubject.pipe(
去盎司(
()=>定时器(5000)
.烟斗(
takeUntil(stopObs),
isEmpty(),
)
),
)
将在
完成
通知之前立即发出true
,这是debounce
发送上次接收的值所需的。如果计时器在没有stopObs
参与的情况下完成,isEmpty
将发出false
而不是true
,但是这对于debounce
,仍然很有效,因为它只需要来自内部可观察对象的值。看起来您可以使用repeat()
而不是repeatWhen()
因为您只使用了Subject,所以保持订阅源可观察对象并不重要。看起来您可以使用repeat()
而不是repeatWhen()
因为您只使用Subject,所以保持订阅源可观察对象并不重要。
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);
})