Rx連携 fun asyncDoHeavyWork(): Single = rxSingle(CommonPool) { // 処理 [email protected] result } fun main(args: Array) = runBlocking { val result = asyncDoHeavyWork().await() println(“Result: ${result * 2}”) }
Rxの場合 val streamA = taskA().toObservable().share() // hot Observable化 val streamB = taskB().toObservable() val streamC = streamA.zipWith(streamB) { a, b -> taskC(a, b) } .flatMap { it.toObservable() } val streamD = streamA.flatMap { task.D(it).toObservable() } val streamE = streamC.zipWith(streamD) { c, d -> taskE(c, d) } .flatMap { it.toObservable() } streamE.subscribe { val result = it } ● taskAの結果が2箇所で使われるのでhot Observableにする必要がある ● operatorの関係で全体的にSingle -> Observableにしなければいけない ● 見た目がグロい
async/awaitの場合 fun taskD(aDeferred: Deferred) = async(CommonPool) { // 処理 val a = aDeferred.await() // aが必要になったタイミングでawait // aが必要な処理 [email protected] result } val a = taskA() val b = taskB() val c = taskC(a, b) val d = taskD(a) val e = taskE(c, d) val result = e.await()
async/awaitの場合 fun taskD(aDeferred: Deferred) = async(CommonPool) { // 処理 val a = aDeferred.await() // aが必要になったタイミングでawait // aが必要な処理 [email protected] result } val a = taskA() val b = taskB() val c = taskC(a, b) val d = taskD(a) val e = taskE(c, d) val result = e.await() ほとんど同期と変わらない!!!