【问题标题】:Dartlang rxdart - merge different type streamsDartlang rxdart - 合并不同类型的流
【发布时间】:2019-08-12 15:08:33
【问题描述】:

这是我的用例:

我有两个不同的Observables

Observable<MobileAdEvent> adEventStream;
Observable<Color> colorStream;

当这两个任何一个发出事件时,我需要接收通知。 zipWith 对我不起作用,因为它会等到两个流都有要发出的事件。 mergeWith 似乎也不起作用,因为它希望两个流都来自同一类型。 任何提示将不胜感激, 谢谢。

【问题讨论】:

    标签: dart flutter rxdart


    【解决方案1】:

    你想要的是combineLatest运营商

    Observable<Foo> foo;
    Observable<Bar> bar;
    
    final output = Observable.combineLatest2(foo, bar, (Foo foo, Bar bar) {
      // TODO: somehow merge them
    });
    

    【讨论】:

    • 不,它不适用 - 取自 observable.dart 文件 - 在所有流都发出至少一项之前,Observable 不会发出。,这不符合我的上述要求,因为当 任何一个 流发出事件时,我需要触发这个。
    • @AngelTodorov 只需在流中推送null
    • 是的,成功了。我会将其标记为答案,但是,这是一种解决方法 - 基本上,我可以使用 zipWith 来达到相同的结果。我相信我们需要更简洁的方法,类似于mergeWith,但只要任一流发出事件就能够发出。
    • zipWith 不会。只有在所有流都提交了某些内容后,才会调用组合器。 combineLatest 在每个事件之后组合值(只要有初始值)。所以combineLatest 更接近merge
    • @RémiRousselet 现在有了 Flutter null 安全性,您无法在非 null 发射流中推送 null,那么我们现在如何应用此解决方法?
    【解决方案2】:

    你试过Observable.race 吗?它非常适合通知:

    给定两个或多个源流,仅从这些流中的第一个发出所有项目以发出项目或通知。

    new Observable.race([
      new Observable.timer(1, new Duration(days: 1)),
      new Observable.timer(2, new Duration(days: 2)),
      new Observable.timer(3, new Duration(seconds: 1))
    ]).listen(print); // prints 3
    

    在此处了解更多信息https://pub.dev/documentation/rxdart/latest/rx/Observable/Observable.race.html

    【讨论】:

      猜你喜欢
      • 2019-02-13
      • 2021-09-22
      • 2016-08-05
      • 1970-01-01
      • 1970-01-01
      • 2016-12-27
      • 2011-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多