2017-06-19 4 views
1

Ich versuche, ein Beispiel zu erhalten, das zwei verschiedene Timeout-Werte verwendet. Ein anfänglich größerer Wert für die erste Emission und dann kürzere Werte für alle nachfolgenden Emissionen. Das Beispiel wird von Java für RxJava v1x in Kotlin konvertiert, obwohl ich versuche, dies ist v2x (nicht sicher, ob das irgendeinen Unterschied macht).RxKotlin (RxJava2) Timeout() wirft keine TimeoutException

Das Problem ist, dass die Zeitüberschreitung für das erste Ereignis keine TimeoutException wirft. Bei einem Wert unter 500 ms erwarte ich, dass ein Stack-Trace gedruckt wird, aber die Ausgabe erfolgt so, als wäre kein Timeout aufgetreten (nachfolgende Emissionen mit einem Timeout von 40 ms führen zu einem Stack-Trace wie erwartet). Was ist falsch an dem folgenden Beispiel, das verhindert, dass die anfängliche Zeitüberschreitung erfolgreich ist?

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) 
} 

Edit: 20-Jun-17

Mit Kotlin 1.1.2-5, mit IntelliJ, mit der vorgeschlagenen Änderung angewendet, habe ich noch den Fehler. Der Versuch, den Code sowieso Ergebnisse laufen, wie ich erwarten würde, mit:

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

Interface Function does not have constructors

Antwort

3

Dies ist ein weiterer Fall von Kotlin impliziert eine Funktion statt einer Observable Instanz benötigen. Versuchen Sie folgendes:

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

Wenn ich das tue, erhalte ich eine Schnittstellenfunktion nicht Konstrukteuren hat, und ich glaube nicht, dass ich es als ein anonymes Objekt implementieren möchten. – amb85

+0

Ich habe keine Erfahrung mit Kotlin und ohne dieses 'Funktion'-Präfix wird der Code nicht für mich kompiliert. Ich vermute, es ist das berüchtigte SAM-Problem. Vielleicht kannst du stattdessen '{it -> ...}' schreiben. – akarnokd

+0

Wenn ich es anders als ursprünglich gepostet versuche, bekomme ich den Fehler 'Keine der folgenden Funktionen kann mit den angegebenen Argumenten aufgerufen werden'. Die Funktion, die ich will, ist '@CheckReturnValue @ SchedulerSupport öffentlichen letzten Spaß Timeout (FirstTimeoutIndicator: ObservableSource !, ItemTimeoutIndicator: Funktion !>!): Beobachtbar ! Definiert in io.reactivex.Observable', das ist, wie Sie in Ihrem ersten Kommentar vorschlagen, aber mit/ohne 'Function', bekomme ich immer noch die oben genannten Fehler. – amb85

Verwandte Themen