gpt4 book ai didi

scala - 合并后如何保留两个可观察对象发出的项目的顺序?

转载 作者:行者123 更新时间:2023-12-04 07:28:42 24 4
gpt4 key购买 nike

我遇到了令我惊讶的 Scala Observables 行为。考虑我下面的例子:

object ObservablesDemo extends App {

val oFast = Observable.interval(3.seconds).map(n => s"[FAST] ${n*3}")
val oSlow = Observable.interval(7.seconds).map(n => s"[SLOW] ${n*7}")
val oBoth = (oFast merge oSlow).take(8)

oBoth.subscribe(println(_))
oBoth.toBlocking.toIterable.last

}

该代码演示了从两个 observable 发射元素。其中一个以“慢”方式(每 7 秒)发出其元素,另一个以“快速”方式(每 3 秒)发出其元素。为了这个问题,假设我们想使用 map 函数定义这些可观察值,并适本地映射 interval 中的数字,如上所示(相对于另一个可能的方法是从两个可观察对象以相同的速率发出项目,然后根据需要过滤

代码的输出对我来说似乎违反直觉:

[FAST] 0
[FAST] 3
[SLOW] 0
[FAST] 6
[FAST] 9 <-- HERE
[SLOW] 7 <-- HERE
[FAST] 12
[FAST] 15

有问题的部分是 [FAST] observable 在 [SLOW] observable 发出 7 之前发出 9 >。我希望 79 之前发出,因为在第七秒发出的任何内容都应该在第九秒发出的内容之前出现。

我应该如何修改代码以实现预期的行为?我查看了 RxScala 文档并开始搜索诸如不同的 interval 函数和 Scheduler 类之类的主题,但我不确定它是否是正确的地方寻找答案。

最佳答案

这看起来应该是这样的。这里列出了秒数和事件。您可以使用 TestObserverTestScheduler 验证 RXScala 是否可用。 RXScala 在 2019 年停产,所以请记住这一点。

Secs   Event
-----------------
1
2
3 [Fast] 0
4
5
6 [Fast] 3
7 [Slow] 0
8
9 [Fast] 6
10
11
12 [Fast] 9
13
14 [Slow] 7
15 [Fast] 12
16
17
18 [Fast] 15
19
20
21 [Fast] 18

关于scala - 合并后如何保留两个可观察对象发出的项目的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68072741/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com