5

是否有等效于Observable.Throttle的 Streams ?如果没有 - 是否有任何相当优雅的方式来实现类似的效果?

4

4 回答 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 毫秒的节流:

  1. ThrottleExtensions<T> Stream<T>扩展的节流时间:stream.throttleTime(Duration(milliseconds: 500)).listen(print);
  2. ThrottleStreamTransformerTimerStream结合使用:stream.transform(ThrottleStreamTransformer((_) => TimerStream(true, const Duration(milliseconds: 500)))).listen(print);
  3. 使用Debounce Extensions / DebounceStreamTransformerstream.debounceTime(Duration(milliseconds: 500)).listen(print);

关于延迟有一些细微的差异,但它们都会受到限制。作为一个关于throttleTimevs的示例,debounceTime请参阅RxJS 中的throttleTime 与 debounceTime 之间有什么区别以及何时选择哪个?

于 2021-03-11T18:31:24.217 回答