3

我试图让一个使用两个不同超时值的示例工作。第一次排放的初始值较大,然后所有后续排放的值都较小。该示例从 Java for RxJava v1x 转换为 Kotlin,尽管我正在尝试这是 v2x(不确定这是否有任何区别)。

问题是第一个事件的超时不会抛出TimeoutException. 将值设置为低于 500 毫秒,我希望打印堆栈跟踪,但我得到的输出好像没有发生超时(超时设置为 40 毫秒的后续发射会按预期产生堆栈跟踪)。以下阻止初始超时成功的示例有什么问题?

fun nextSolarEclipse(after: LocalDate): Observable<LocalDate> {
    return Observable
            .just(
                    LocalDate.of(2016, Month.MARCH, 9),
                    LocalDate.of(2016, Month.SEPTEMBER, 1),
                    LocalDate.of(2017, Month.FEBRUARY, 26),
                    LocalDate.of(2017, Month.AUGUST, 21),
                    LocalDate.of(2018, Month.FEBRUARY, 15),
                    LocalDate.of(2018, Month.JULY, 13),
                    LocalDate.of(2018, Month.AUGUST, 11),
                    LocalDate.of(2019, Month.JANUARY, 6),
                    LocalDate.of(2019, Month.JULY, 2),
                    LocalDate.of(2019, Month.DECEMBER, 26)
            )
            .skipWhile { date ->
                !date.isAfter(after)
            }
            .zipWith(
                    Observable.interval(500, 50, TimeUnit.MILLISECONDS),
                    { date, _ -> date }
            )
}

fun main(args: Array<String>) {
    nextSolarEclipse(LocalDate.now())
            .timeout<Long, Long>(
                    { Observable.timer(400, TimeUnit.MILLISECONDS) },
                    { Observable.timer(40, TimeUnit.MILLISECONDS) }
            )
            .subscribe(
                    { println(it) },
                    { it.printStackTrace() },
                    { println("Completed") }
            )

    TimeUnit.MILLISECONDS.sleep(2000)
}

编辑:2017 年 6 月 20 日

使用 Kotlin 1.1.2-5,使用 IntelliJ,并应用建议的更改,我仍然得到错误。正如我所期望的那样,无论如何尝试运行代码都会产生:

Error:(34, 21) Kotlin: Interface Function does not have constructors

接口函数没有构造函数

4

1 回答 1

4

这是 Kotlin 的另一种情况,暗示您需要一个函数而不是Observable实例。尝试这个:

.timeout<Long, Long>(
     Observable.timer(400, TimeUnit.MILLISECONDS),
     Function { Observable.timer(40, TimeUnit.MILLISECONDS) }
)
于 2017-06-19T22:15:57.123 回答