2017-06-19 40 views
1

我试图得到一个使用两个不同超时值的示例工作。第一次排放的初始值较大,随后所有排放的值则较短。这个例子是从RxJava v1x的Java转换为Kotlin,但我试图这是v2x(不知道这是否有任何区别)。RxKotlin(RxJava2)timeout()不会抛出TimeoutException

问题是第一个事件的超时不会引起TimeoutException。设置值低于500ms时,我期望打印堆栈轨迹,但是我得到的输出就好像没有发生超时(随后的超时设置为40ms的发射会导致堆栈轨迹如预期)。以下示例阻止成功初始超时有什么问题?

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月17

随着科特林1.1.2-5,使用的是IntelliJ,应用了建议改变,我仍然得到错误。试图想运行代码的结果,正如我所期望的,有:

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

Interface Function does not have constructors

回答

3

这又是一个暗示你需要的功能,而不是一个Observable实例科特林的情况。试试这个:

.timeout<Long, Long>(
    Observable.timer(400, TimeUnit.MILLISECONDS), 
    Function { Observable.timer(40, TimeUnit.MILLISECONDS) } 
) 
+0

如果我这样做,我得到一个接口函数没有构造函数,我不认为我想实现它作为一个匿名对象。 – amb85

+0

我没有Kotlin的经验,没有'Function'前缀代码不会为我编译。我猜这是臭名昭着的SAM问题。也许你可以改写'{it - > ...}'。 – akarnokd

+0

如果我尝试任何其他方式,而不是最初发布,我得到的错误“以下功能都不能用所提供的参数调用。我想我需要的函数是@CheckReturnValue @SchedulerSupport public final fun timeout(firstTimeoutIndicator:ObservableSource !,itemTimeoutIndicator:Function !>!):可观测的!在io.reactivex.Observable'中定义,正如你在初始评论中所建议的那样,但是有/没有'Function',我仍然得到上述错误。 – amb85

相关问题