RxJava Single to Completable to Single - как передать результат первого Single во второй Single - PullRequest
0 голосов
/ 12 июня 2018

В следующем методе, как передать результат первого сингла во второй сингл?

Как написано сейчас, когда он возвращается, somethingId пусто.Если я изменю значение в возвращенном Single.just(somethingId) на что-то отличное от пустой строки, оно вернет это значение.

Интересно то, что если я остановлю точку в методе, она остановится на строке 7, прежде чем она перейдет на строку5 и 6.

Документация для andThen в строке 7 гласит:

Возвращает Single, который подпишется на этот Completable и, как только он будет завершен, подпишется на{@code next} SingleSource.

Почему он выполняется в таком порядке и / или есть ли лучший способ сделать это?

1 override fun downloadSomething(): Single<String> {
2    var somethingId = ""
3    return remoteDataSource.downloadSomething() // this is a Single
4        .flatMapCompletable { something ->
5            somethingId = something.id
6            saveSomething(something) // this is a Completable
7        }.andThen(Single.just(somethingId))
8 }

Единственное, что нужноВ этот момент я могу подумать, что нужно вернуть Single для метода saveSomething() в строке 6 (который работает).Однако затем я изменяю сигнатуру этого метода, чтобы использовать его в этом конкретном методе, который кажется неправильным.Конечно, есть способ заставить это работать без этого?

1 Ответ

0 голосов
/ 12 июня 2018

Вы можете достичь того же результата, не изменяя saveSomething сигнатуру метода, если полностью исключите операцию flatMapCompletable:

1 override fun downloadSomething(): Single<String> {
2    return remoteDataSource.downloadSomething() // this is a Single
3        .flatMap { something ->        
4            saveSomething(something).andThen(Single.just(something.id))
5        }
6 }

Или:

1 override fun downloadSomething(): Single<String> {
2    return remoteDataSource.downloadSomething() // this is a Single
3        .flatMap { something ->        
4           saveSomething(something).toSingleDefault(something.id)
5        }
6 }

Проблема, с которой вы столкнулисьна данный момент Single.just(somethingId) выполняется как часть создания конвейера RxJava, и, как таковое, это происходит до завершения downloadSomething, и поэтому значение somethingId все еще является пустой строкой.

...