首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不带runBlocking的协程作用域返回值

不带runBlocking的协程作用域返回值
EN

Stack Overflow用户
提问于 2021-05-30 09:50:06
回答 1查看 253关注 0票数 1

我试图根据repo调用的响应数据运行一个函数,但遇到了使用协程作用域的竞争条件/返回数据的问题。基于这两个伪代码块,我想知道我是否可以得到一些帮助?

选项1:如果不使用runBlocking,则无法在协程作用域内返回响应。

代码语言:javascript
运行
复制
fun mainFunction(): Boolean {
  return subFunction(getResponse()) //returns boolean
}

private fun getResponse () {
  scope.launch{
    val response = async { someApiCall }.await()

    return response
  }
}

选项2:在调用subFunction时,response值未初始化,因此导致错误。

代码语言:javascript
运行
复制
lateinit var response: MutableList<>

fun mainFunction(): Boolean {
  return subFunction(response) //returns boolean
}

private fun getResponse () {
  scope.launch{
    response = async { someApiCall }.await()
  }
}
EN

回答 1

Stack Overflow用户

发布于 2021-05-31 07:12:36

案例1: Main函数返回一些东西

代码语言:javascript
运行
复制
suspend fun mainFunction(): Boolean = subFunction(getResponse())

fun subFunction(input: Response): Boolean {
    // Do something
    return something
}

suspend fun getResponse() = withContext(Dispatchers.IO) {
    someApiCall()
}

这样,我们就可以使用scope.launch了,那么mainFunction的调用者就可以随意使用了。

代码语言:javascript
运行
复制
fun metaMainFunction() {
    scope.launch {
        val isSomething = mainFunction()
        // Do something with isSomething
    }
}

情况2:mainFunction是即兴的,我们对情况1的metaMainFunction应用相同的行为

代码语言:javascript
运行
复制
fun mainFunction() {
    scope.launch {
        val response = getResponse()
        // Do something with response
    }
}

最佳实践是被调用者应该决定执行哪个线程。在这种情况下,我们应该始终对getResponse()使用withContext(Dispatchers.IO)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67757013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档