【发布时间】:2021-02-20 00:51:53
【问题描述】:
我有一个可观察的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);
})
但还有另一个问题:如果我多次点击“开始”按钮并向startObs 发出多个值,那么我开始获得多个console.log 的单个去抖动值!
那么有没有办法在不停止整个 observable 的情况下只取消去抖动的发射?
【问题讨论】:
-
看起来你可以只使用
repeat()而不是repeatWhen(),因为你只使用了主题,所以你保持订阅源 Observable 并不重要。
标签: rxjs