Объедините 3 отдельных результата - один поток - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь производить вычисления один за другим, асинхронно.

fun method1(): Int{
return 2+2
}

fun method2(value: Int): Int{
return value * 2
}

fun method3(value: Int): Int{
return value * 3
}

Теперь я хочу, чтобы метод 2 работал после метода 1 и получал результат от него. Также метод 3 работает после метода 2 и берет от него результат. Можно ли сделать это с помощью rx kotlin и сделать это одним потоком?

Ответы [ 2 ]

1 голос
/ 30 июня 2020

Это можно сделать, используя flatMap следующим образом:

fun performAsyncCalculation(): Observable<Int> {
        return method1()
            .flatMap { result1 -> method2(result1) }
            .flatMap { result2 -> method3(result2) }
}

, где методы:

fun method1(): Observable<Int> {
    return Observable.create { emitter ->
        // perform calculation to produce requiredInt1
        emitter.onNext(requiredInt1)
        emitter.onComplete()
}

fun method2(requiredInt1: Int): Observable<Int> {
    return Observable.create { emitter ->
        // perform calculation to produce requiredInt2
        emitter.onNext(requiredInt2)
        emitter.onComplete()
}

fun method3(requiredInt2: Int): Observable<Int> {
    return Observable.create { emitter ->
        // perform calculation to produce requiredInt3
        emitter.onNext(requiredInt3)
        emitter.onComplete()
}
1 голос
/ 21 июня 2020

Если вы хотите связать вызов этих методов, вы можете сделать, как показано ниже:

   fun chain(): Single<Int> {
        return Single.just(method1())
                .map { result1 -> method2(result1) }
                .map { result2 -> method3(result2) }
   }

Однако, если операции в method1, method2 или method3 асинхронны, я бы предложил обернуть их в Single.

Для справки map vs flatMap посмотрите:

https://medium.com/mindorks/rxjava-operator-map-vs-flatmap-427c09678784

...