RxKotlin (RxJava2) timeout() 不会抛出 TimeoutException
RxKotlin (RxJava2) timeout() doesn't throw TimeoutException
我试图让一个使用两个不同超时值的示例工作。第一次排放的初始值较大,所有后续排放的初始值较短。该示例从 Java 转换为 Kotlin for 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)
}
编辑:2017 年 6 月 20 日
使用 Kotlin 1.1.2-5,使用 IntelliJ,应用建议的更改后,我仍然遇到错误。正如我所料,尝试 运行 代码无论如何都会产生:
Error:(34, 21) Kotlin: Interface Function does not have constructors
这是 Kotlin 的另一个例子,暗示您需要一个函数而不是 Observable
实例。试试这个:
.timeout<Long, Long>(
Observable.timer(400, TimeUnit.MILLISECONDS),
Function { Observable.timer(40, TimeUnit.MILLISECONDS) }
)
我试图让一个使用两个不同超时值的示例工作。第一次排放的初始值较大,所有后续排放的初始值较短。该示例从 Java 转换为 Kotlin for 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)
}
编辑:2017 年 6 月 20 日
使用 Kotlin 1.1.2-5,使用 IntelliJ,应用建议的更改后,我仍然遇到错误。正如我所料,尝试 运行 代码无论如何都会产生:
Error:(34, 21) Kotlin: Interface Function does not have constructors
这是 Kotlin 的另一个例子,暗示您需要一个函数而不是 Observable
实例。试试这个:
.timeout<Long, Long>(
Observable.timer(400, TimeUnit.MILLISECONDS),
Function { Observable.timer(40, TimeUnit.MILLISECONDS) }
)