RxKotlin(RxJava2)timeout()不会抛出TimeoutException

时间:2017-06-19 21:44:56

标签: rx-java rx-java2 rx-kotlin

我正在尝试使用两个不同的超时值的示例工作。第一次排放的初始值较大,然后是所有后续排放的较短值。该示例从Java转换为Kotlin用于RxJava v1x,虽然我尝试这是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)
}

编辑:20-Jun-17

使用Kotlin 1.1.2-5,使用IntelliJ,应用建议的更改,我仍然得到错误。正如我所料,试图运行代码的结果是:

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

Interface Function does not have constructors

1 个答案:

答案 0 :(得分:4)

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

.timeout<Long, Long>(
     Observable.timer(400, TimeUnit.MILLISECONDS),
     Function { Observable.timer(40, TimeUnit.MILLISECONDS) }
)
相关问题