首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >rxjs:取消一个去抖动的可观测对象

rxjs:取消一个去抖动的可观测对象
EN

Stack Overflow用户
提问于 2020-11-07 22:56:14
回答 1查看 66关注 0票数 2

我有一个可观察到的Subject,它通过去抖动发出一些变化:

代码语言:javascript
代码运行次数:0
运行
复制
someSubject.pipe(
  debounceTime(5000),
).subscribe(response => {
  console.log('Value is', response);
})

现在,我需要一个Stop按钮在屏幕上的某个地方,它可以取消我的反发射。所以我创建了一个按钮:

代码语言:javascript
代码运行次数:0
运行
复制
const stopObs = new Subject();
...
<button onClick={() => stopObs.next()}>Stop</button>

并像这样修改我的订阅:

代码语言:javascript
代码运行次数:0
运行
复制
someSubject.pipe(
  debounceTime(5000),
  takeUntil(stopObs),
).subscribe(response => {
  console.log('Value is', response);
})

这可以很好地工作,在点击“停止”后,我停止在控制台中获取值,但有一个问题:观察值永远停止。我需要它能够发出新的值,我只需要取消已经开始解除发射。

我的第一个想法是创建一个新的主题并使用repeatWhen

代码语言:javascript
代码运行次数:0
运行
复制
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

那么,有没有一种方法可以在不停止整个观察点的情况下,只取消去抖动的发射呢?

EN

回答 1

Stack Overflow用户

发布于 2020-11-08 05:26:32

由于debounceTime只是

代码语言:javascript
代码运行次数:0
运行
复制
const duration = timer(dueTime, scheduler);
return debounce(() => duration);

我认为你可以这样解决这个问题:

代码语言:javascript
代码运行次数:0
运行
复制
someSubject.pipe(
  debounce(() => timer(5000).pipe(takeUntil(stopObs))),
)

如果你想在计时器由于stopObs而被取消时发送最后一个值,你可以尝试这样做:

代码语言:javascript
代码运行次数:0
运行
复制
someSubject.pipe(
  debounce(
    () => timer(5000)
      .pipe(
        takeUntil(stopObs),
        isEmpty(),
      )
  ),
)

isEmpty()将在complete通知之前立即发出true,这是debounce发送最后接收的值所需的。如果计时器在没有stopObs参与的情况下完成,isEmpty将发出false而不是true,但这仍然适用于debounce,因为它只需要来自内部可观察对象的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64729001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档