Kotlin中如何保证异步调用顺序执行?

问题描述 投票:0回答:2
class BlockEventManager(private val scope: CoroutineScope) {...}
    
private val blockEventManager = BlockEventManager(viewModelScope) ...

fun doSomethingUsefulOneAsync() {
    'some remote service call
}

fun doSomethingUsefulTwoAsync() {
    'some other remote service call dependent on doSomethingUsefulOneAsync()
}


我们如何实现如果doSomethingUsefulOneAsync已完成然后执行doSomethingUsefulTwoAsync。我不相信 async.await() 是为此设置的吗?

blockEventManager.startBlockingAsyncWork {
    val step1 = async { doSomethingUsefulOneAsync() }
    step1.await()
    doSomethingUsefultwoAsync() //will this execute only after step1 completes or fails?
...

kotlin asynchronous suspend
2个回答
0
投票

我不知道你的

blockEventManager
是什么,但我假设
startBlockingAsyncWork
将挂起函数作为参数并在协程中调用它。

协程的关键特性之一是结构化并发,并且绝对保证您的调用是顺序的,因此在第一个 Deferred 上调用

await
可以保证
doSomethingUsefulOneAsync()
将在执行流程继续之前返回。

但是,如果您想按顺序执行这些操作,则首先不应该引入

async
。只需依次调用这两个函数即可。

这是一种代码味道,

suspend
函数的名称中会包含术语“异步”。一个“正确组合”的挂起函数以挂起的方式完成其工作,然后返回其结果(如果有)。例如,挂起函数不应启动网络调用并在返回之前不等待结果就返回。但我所说的等待是指暂停协程直到收到结果,而不是阻塞线程。


0
投票

val one = async { doSomethingUsefulOne() } val two = async { doSomethingUsefulTwo() } println("The answer is ${one.await() + two.await()}")

仅使用 launch 并在同一协程中调用两个调用即可确保它们按顺序执行,因为协程内的代码与常规代码相同并按顺序执行。

launch { val one = doSomethingUsefulOne() val two = doSomethingUsefulTwo() println("The answer is ${one + two}") }

© www.soinside.com 2019 - 2024. All rights reserved.