是否有等效于Observable.Throttle的 Streams ?如果没有 - 是否有任何相当优雅的方式来实现类似的效果?
问问题
943 次
4 回答
4
目前在流上没有这样的方法。已提交增强请求,您可以在问题 8492中加注星标。
但是,您可以使用where方法来做到这一点。在以下示例中,我定义了一个ThrottleFilter
在给定持续时间内忽略事件的类:
import 'dart:async';
class ThrottleFilter<T> {
DateTime lastEventDateTime = null;
final Duration duration;
ThrottleFilter(this.duration);
bool call(T e) {
final now = new DateTime.now();
if (lastEventDateTime == null ||
now.difference(lastEventDateTime) > duration) {
lastEventDateTime = now;
return true;
}
return false;
}
}
main() {
final sc = new StreamController<int>();
final stream = sc.stream;
// filter stream with ThrottleFilter
stream.where(new ThrottleFilter<int>(const Duration(seconds: 10)).call)
.listen(print);
// send ints to stream every second, but ThrottleFilter will give only one int
// every 10 sec.
int i = 0;
new Timer.repeating(const Duration(seconds:1), (t) { sc.add(i++); });
}
于 2013-02-25T17:02:36.973 回答
2
rate_limit 包提供流的节流和去抖动。
于 2014-10-13T13:32:34.820 回答
1
以下版本更接近于 Observable.Throttle 所做的:
class Throttle extends StreamEventTransformer {
final duration;
Timer lastTimer;
Throttle(millis) :
duration = new Duration(milliseconds : millis);
void handleData(event, EventSink<int> sink) {
if(lastTimer != null){
lastTimer.cancel();
}
lastTimer = new Timer(duration, () => sink.add(event));
}
}
main(){
//...
stream.transform(new Throttle(500)).listen((_) => print(_));
//..
}
于 2013-05-19T14:38:54.070 回答
1
@Victor Savkin 的回答很好,但我总是尽量避免重新发明轮子。所以除非你真的只需要那个油门,否则我建议使用RxDart包。由于您正在处理 Streams 和其他反应性对象,RxDart除了节流之外还有很多不错的东西可以提供。
我们可以通过以下几种方式实现 500 毫秒的节流:
ThrottleExtensions<T>
Stream<T>
扩展的节流时间:stream.throttleTime(Duration(milliseconds: 500)).listen(print);
- 将ThrottleStreamTransformer与TimerStream结合使用:
stream.transform(ThrottleStreamTransformer((_) => TimerStream(true, const Duration(milliseconds: 500)))).listen(print);
- 使用Debounce Extensions / DebounceStreamTransformer:
stream.debounceTime(Duration(milliseconds: 500)).listen(print);
关于延迟有一些细微的差异,但它们都会受到限制。作为一个关于throttleTime
vs的示例,debounceTime
请参阅RxJS 中的throttleTime 与 debounceTime 之间有什么区别以及何时选择哪个?
于 2021-03-11T18:31:24.217 回答