2017-08-14 19 views
6

Tôi có đoạn code RxJava2 Kotlin sau:RxJava Completabe andThen thử nghiệm

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

này mô phỏng có thể quan sát được Completable (tưởng tượng một hoạt động cập nhật đơn giản để một API) và sau đó là một quan sát đơn (hình ảnh một hoạt động get trên API). Tôi muốn nối hai quan sát theo một cách mà khi hoàn thành, Single chạy và cuối cùng tôi nhận được sự kiện onSuccess trên máy quan sát của tôi (Int 42).

Tuy nhiên mã kiểm tra này không hoạt động. Sự khẳng định không thành công với các lỗi sau:

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

Tôi không thể hiểu được những gì tôi đang làm sai, tôi hy vọng rằng các Completable phát ra onComplete trên thuê bao, và sau đó đăng ký cao Độc thân, và quan sát của tôi (tester) được một sự kiện onSuccess với giá trị 42, nhưng có vẻ như việc đăng ký vẫn "treo" không phát ra bất cứ điều gì.

Ý tưởng là tương tự như tìm thấy trong bài viết trên blog này: 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 
    }); 

Trả lời

8

Vấn đề là Kotlin với việc sử dụng không rõ ràng của dấu ngoặc nhọn:

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

Bạn tạo một SingleSource mà không chú ý đến số SingleObserver, nhưng điều đó bị ẩn theo cú pháp Kotlin. Những gì bạn cần là sử dụng đơn giản:

.andThen(Single.just(42)) 

hoặc sử dụng chậm

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

Cảm ơn akarnokd, đối với một số lý do tôi nói thêm rằng vào mã vì ban đầu tôi đã làm '.andThen {Single.just (42) } 'không được biên dịch. – Miquel