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 に答える
1

@Victor Savkinの答えは素晴らしいですが、私は常に車輪の再発明を避けようとしています. したがって、そのスロットルだけが本当に必要な場合を除き、RxDartパッケージの使用をお勧めします。ストリームやその他のリアクティブ オブジェクトを扱っているため、 RxDartにはスロットリング以外にも多くの優れた機能があります。

500 ミリ秒のスロットルを実現するには、いくつかの方法があります。

  1. ThrottleExtensions<T> Stream<T>拡張機能からのthrottleTime :stream.throttleTime(Duration(milliseconds: 500)).listen(print);
  2. ThrottleStreamTransformerTimerStreamを組み合わせる:stream.transform(ThrottleStreamTransformer((_) => TimerStream(true, const Duration(milliseconds: 500)))).listen(print);
  3. デバウンス拡張機能/ DebounceStreamTransformer の使用:stream.debounceTime(Duration(milliseconds: 500)).listen(print);

遅延に関しては微妙な違いがいくつかありますが、それらはすべて抑制されます。throttleTimevs.の例として、RxJS での throttleTime と debounceTime の違いと、どちらをいつ選択するかをdebounceTime参照してください。

于 2021-03-11T18:31:24.217 に答える