在 kotlin 协程中实现 async-await()

Jai*_*odi 4 android coroutine kotlin kotlin-coroutines

我创建了如下功能:

fun getPercentage(id:String): String {
    var percentage=""
    scope.launch {
        percentage=repo.getPercentage(id)?.get(0)?.percent.toString()
        Log.e("$$$ value >>","$$$ value >>"+percentage)
    }
    Log.e("$$$ value outside >>","$$$ value >>"+percentage)
    return percenatge
}
Run Code Online (Sandbox Code Playgroud)

在这里,我无法使用变量:百分比返回更新后的值。

我得到的日志如下:

$$$ value outside >> 
$$$ value >> 50
Run Code Online (Sandbox Code Playgroud)

意味着我无法返回最新值。流程出了问题。

有人建议我使用 async{} 和await()。但我不知道这对这里有什么帮助?

请指导。谢谢。

Ram*_*man 7

该函数通过launchgetPercentage函数在后台创建一个协程,然后无需等待即可继续运行。因此,您的“外部”代码在“内部”协程完成之前运行。

第一个选项是使用async函数来从协程返回Deferred值:

fun getPercentage(id:String): Deferred<String> {
    return scope.async {
        percentage=repo.getPercentage(id)?.get(0)?.percent.toString()
        Log.e("$$$ value >>","$$$ value >>"+percentage)
    }
}
Run Code Online (Sandbox Code Playgroud)

当然请注意,您更有可能想要创建getPercentage一个挂起函数,然后await直接调用:

suspend fun getPercentage(id:String): String {
    val percentageDeferred = scope.async {
        percentage=repo.getPercentage(id)?.get(0)?.percent.toString()
        Log.e("$$$ value >>","$$$ value >>"+percentage)
    }
    val percentage = percentageDeferred.await()
    Log.e("$$$ value outside >>","$$$ value >>"+percentage)
    return percentage    
}
Run Code Online (Sandbox Code Playgroud)

您也可能想在之前执行其他操作,否则await您最好也创建repo.getPercentage一个挂起函数并直接调用它:

suspend fun getPercentage(id:String): String {
    // if repo.getPercentage is a suspend function, this call suspends
    // like the await in the previous example
    val percentage = repo.getPercentage(id)?.get(0)?.percent.toString()
    Log.e("$$$ value outside >>","$$$ value >>"+percentage)
    return percentage    
}
Run Code Online (Sandbox Code Playgroud)

请参阅Kotlin 文档中的使用异步并发。