2017-08-14 20 views
6

Ben şu RxJava2 Kotlin kodu:RxJava Completabe andthen test

val tester = Completable.complete() 
      .andThen(SingleSource<Int> { Single.just(42) }) 
      .test()   
tester.assertComplete() 
tester.assertValue(42) 

Bu bir olsun operasyon Tek gözlenebilir (görüntü daha sonra Completable (bir API için basit güncelleme işlemini hayal) gözlemlenebilir ve sahip simüle API). İki gözlemciyi, Completable bittiğinde, Single çalıştığı ve nihayet gözlemcimde (Int 42) onSuccess olayını aldığım şekilde birleştirmek istiyorum. Bununla birlikte, bu sınama kodu çalışmıyor. iddiası aşağıdaki hata nedeniyle başarısız:

java.lang.AssertionError: Not completed 
(latch = 1, values = 0, errors = 0, completions = 0)) 

ben yanlış yapıyorum anlamak mümkün değilim, Completable abonelik onComplete yayar ve sonra Tek abone ve benim gözlemci (tester) alır bekliyoruz 42 değerine sahip bir onSuccess olayı, ancak aboneliğin hiçbir şey yaymayacak şekilde "askıya alınmış" kaldığı anlaşılıyor.

fikri bu blog yayınında bulunan birine benzer:

.andThen(SingleSource<Int> { Single.just(42) }) 

Beni anlayan bir SingleSource oluşturun: https://android.jlelse.eu/making-your-rxjava-intentions-clearer-with-single-and-completable-f064d98d53a8

apiClient.updateMyData(myUpdatedData) // a Completable 
    .andThen(performOtherOperation()) // a Single<OtherResult> 
    .subscribe(otherResult -> { 
     // handle otherResult 
    }, throwable -> { 
     // handle error 
    }); 

cevap

8

sorun küme parantezleri onun belirsiz kullanımı ile Kotlin olduğunu SingleObserver'a işaret ediyor, ancak bu Kotlin sözdizimi tarafından gizlenmiş. Tek ihtiyacın düz kullanımıdır: ekledim nedense

.andThen(Single.defer { Single.just(42) }) 
+0

Teşekkür akarnokd

.andThen(Single.just(42)) 

veya ertelenmiş kullanımı o koda başlangıçta yaptığım çünkü '.andThen {Single.just (42) } 'hangi bir derleme değildi. – Miquel