Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
rxjs:取消去抖动的可观测_Rxjs - Fatal编程技术网

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);
})