【发布时间】:2018-04-13 19:50:08
【问题描述】:
我想创建一个有返回值的协程方法。
例如)
fun funA() = async(CommonPool) {
return 1
}
fun funB() = async(CommonPool) {
return 2
}
fun sum() {
launch {
val total = funA().await() + funB().await()
}
}
如果我想用 sum 方法返回总和,我应该怎么做?
喜欢,
fun sum(): Int {
launch {
val total = funA().await() + funB().await()
}
return total
}
【问题讨论】:
-
旁注:当您执行
funA().await() + funB().await()时,您实际上是在依次运行funA()和funB()。如果你想并行运行它们,你应该做val a = funA()和val b = funB(),然后做a.await() + b.await()。 -
这是非常好的建议。我是 kotlin 的新手,我想知道当我们使用 a.await() 而不是 funA().await() 时会有什么不同吗?为什么使用变量两个函数开始并行处理。
-
@Sharad 这是因为 await 产生执行(暂时停止函数),直到 promise 解决。如果您先调用两个协程,则在到达
await之前都使用 start。这两个变量的值将是一个未解决的承诺,这就是你需要等待的原因。 -
你能解释一下为什么你想让 sum 成为一个非挂起函数吗?
sum的调用者应该在协程中调用它而不是将异步代码转换为同步代码,这违背了协程的目的。您将不得不阻止fun sum的调用者。如果您的来电者是同步的,那么我认为这是问题所在,而您的问题是为症状而不是原因寻找创可贴。