【问题标题】:Strange results from Observable.concat(observable,observable)来自 Observable.concat(observable,observable) 的奇怪结果
【发布时间】:2018-02-07 18:00:20
【问题描述】:

过了一会儿,我阅读了 RxJava concat 并决定测试我的理解。但是我遇到了一些我不太了解的行为。

问题在于,当我连接两个可观察对象时,我会得到不同的行为,具体取决于我将它们传递给 Observable.concat() 的顺序

val ob1 = createObservableSomehow()

val ob2 = createObservableSomehow()

Observable.concat(ob1,ob2).subscribe(::println) //only prints emissions of ob1


Observable.concat(ob2,ob1).subscribe(...) //concats all emissions correctly

查看随附的屏幕截图,了解如何创建这两个 observable。

【问题讨论】:

  • 你到底想知道什么?
  • concat 要求其来源完成,然后才会切换到下一个。
  • 请不要将图像用于代码,拥有屏幕阅读器或限制性公司代理的人无法阅读您要说的内容。
  • @Todd 没错,使用内联代码时遇到了困难

标签: android kotlin rx-java reactive-programming rx-java2


【解决方案1】:

concat() 将等待第一个流完成,然后才会开始从第二个流发射项目。

在您的情况下,您声明第一个 observable 已完成其发射,因此concat() 假设仍有发射,因为从未发送过任何终端事件。 p>

在您的第一个流中执行it.onComplete() 后,您将看到您期望的输出。

【讨论】:

  • 很好的答案,它在文档中的什么地方这么说?
  • @Remario,“返回一个 Observable,它一个接一个地发出两个 ObservableSource 发出的项目,没有交错”。在这种情况下,“一个接一个地发出一个可观察的”假设,第一个应该完成,否则concat 无法了解是否有一些项目要来。另外,请参阅rx marble 如何从第一个流中发出终端事件 (|)。
  • 谢谢我,反应式编程有时很抽象,它总是让我思考
【解决方案2】:

您需要在最后一个 onNext() 之后为第一个 Observable 调用 onComplete()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多