-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Description
We have no operator that prevents subsequent emissions for a certain time after an emission.
In RxJava there is throttleFirst
for that.
flow {
repeat(10) {
emit(it)
delay(101)
}
}
.throttleFirst(500)
.collect {
println(it)
}
The example above should print 0
and 5
. Both should be emitted without any added delay.
One use-case is button clicks where (accidental) repeated clicks should be filtered. If I click a button twice accidentally, only the first click event would make it downstream and the second click be ignored because it came in too fast after the first one.
debounce(500)
is not suitable because it
a) delays the emission of the first value by at least 500ms and
b) delays the emission of any value until the user stops clicking for at least 500ms.
sample(500)
is not suitable because it
a) delays the emission of the first value by 500ms and
b) emits nothing if the Flow
is closed within 500ms after collection has started.
The related throttleLatest
was mentioned in #1107 but no reason was given why it nor it's siblings have made it into Flow
so far.
Activity
jxdabc commentedon May 7, 2020
@fluidsonic
If I'm not wrong.
The above
throttleLatest
example should print0
,4
.The operator you want seems being called
throttleFirst
.Plese see https://github.com/ReactiveX/RxJava/wiki/Filtering-Observables#throttlefirst
fluidsonic commentedon May 7, 2020
@jxdabc you're right,
throttleFirst
is more appropriate for solving the problem. I'll update the issue.[-]Add throttleLatest Flow operator[/-][+]Add throttleFirst Flow operator[/+]davidmigloz commentedon Dec 7, 2021
Duplicate of #1446
hoc081098 commentedon Mar 24, 2022
please check my lib https://github.com/hoc081098/FlowExt