【问题标题】:Generate a stream with delays for each emit in dart为 dart 中的每个发射生成一个具有延迟的流
【发布时间】:2019-05-30 05:01:29
【问题描述】:

我想从具有特定 dart 延迟的列表中以流的形式发出值。

所以,从 [1,2,3],这是一个常规列表,我想在单独的事件中发出像 1...2...3 这样的值。

我试过这样的

List<int> myList = [1,2,3];
Subject _current = BehaviorSubject<int>();
Stream<int> get current$ => _current.stream.delay(Duration(seconds:1));

myList.forEach(current.add);

但我得到的是...123,所以这会将整个流延迟 1 秒,而不是列表中的每个值。

有什么想法吗? 谢谢

【问题讨论】:

    标签: dart reactive rxdart


    【解决方案1】:

    使用来自rxdart 包的interval

    Stream.fromIterable(List<int>.generate(100, (i) => i))
            .interval(Duration(milliseconds: 10))
            .listen((v) {
          print(v);
    });
    

    【讨论】:

      【解决方案2】:

      使用rxdart 0.25.0 的一种解决方案:

      final Stream<int> stream = 
          Rx.range(1, 3)
            .asyncExpand((event) => 
              event == 1
              ? Stream.value(event) // return first value immediately
              : Rx.timer(event, Duration(seconds: 1))
          );
      

      【讨论】:

        【解决方案3】:

        我设法让它工作

        Observable.range(myList)
          .concatMap((i) =>
            new Observable.timer(i, new Duration(seconds: 1))
          .listen(print);
        

        来自rxdart 文档本身。感谢 Günter 的好建议。

        【讨论】:

          【解决方案4】:

          rxdart

          包提供了一个delay 转换器或方法

          new Observable.fromIterable([1, 2, 3, 4])
            .delay(new Duration(seconds: 1))
            .listen(print); // [after one second delay] prints 1, 2, 3, 4 immediately
          

          还有像debounce这样的人

          【讨论】:

          • 谢谢,但这和我做的一样,等待 1 秒,然后立即打印;我想要的是打印 1,等待 1 秒,打印 2,等待 1 秒,打印 3,等待 1 秒,打印 4,等待 1 秒。
          • 我实际上是从 rxdart 本身得到了答案,使用 concatMap,谢谢。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-21
          • 1970-01-01
          相关资源
          最近更新 更多