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?
...
我不知道你的
blockEventManager
是什么,但我假设 startBlockingAsyncWork
将挂起函数作为参数并在协程中调用它。
协程的关键特性之一是结构化并发,并且绝对保证您的调用是顺序的,因此在第一个 Deferred 上调用
await
可以保证 doSomethingUsefulOneAsync()
将在执行流程继续之前返回。
但是,如果您想按顺序执行这些操作,则首先不应该引入
async
。只需依次调用这两个函数即可。
这是一种代码味道,
suspend
函数的名称中会包含术语“异步”。一个“正确组合”的挂起函数以挂起的方式完成其工作,然后返回其结果(如果有)。例如,挂起函数不应启动网络调用并在返回之前不等待结果就返回。但我所说的等待是指暂停协程直到收到结果,而不是阻塞线程。
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}")
}