如何将挂起函数的结果传递给非挂起函数?
How to pass the result of a suspending function to a non-suspending function?
假设我有函数
suspend fun doSomething(): Result {
val result = doStuff().await() //this is the suspending part
return result
}
我现在想构建一个通用函数,它可以将上述函数作为参数。它的主要目标是将传递的结果变成一个livedata对象:
fun getResultLiveData(resource: Result): LiveData<Result> = liveData(Dispatchers.IO) {
emit(resource)
}
但是,当我尝试调用挂起函数以获取其结果作为参数时,如下所示:
fun someLiveData = getResultLiveData(doSomething())
getResultLiveData
:
括号内的部分出现(可以理解的)预编译异常
Suspend function doSomething() should be called only from a coroutine or another suspend function
这显然是有道理的,但是我如何将我的 getResultLiveData 的参数注释为挂起函数的结果?
现在,如果我要执行以下操作:
fun getResultLiveData(): LiveData<Result> = liveData(Dispatchers.IO) {
emit(doSomething())
}
它会起作用,因为它是在函数的暂停部分(即 LiveDataScope
)的范围内调用的。但我只想更进一步抽象...
正如@CommonsWare 所建议的,解决方案是传递一个挂起函数本身,而不是函数的结果作为参数。当挂起函数有参数时,这也有效。
getResultLiveData
函数应如下所示:
fun getResultLiveData(resourceFunction: suspend () -> Result): LiveData<Result> = liveData(Dispatchers.IO) {
emit(resourceFunction())
}
然后您可以轻松地在 lambda 表达式中调用该函数:
getResultLiveData{doStuff(param1, param2)}
或者干脆
getResultLiveData{doStuff()}
假设我有函数
suspend fun doSomething(): Result {
val result = doStuff().await() //this is the suspending part
return result
}
我现在想构建一个通用函数,它可以将上述函数作为参数。它的主要目标是将传递的结果变成一个livedata对象:
fun getResultLiveData(resource: Result): LiveData<Result> = liveData(Dispatchers.IO) {
emit(resource)
}
但是,当我尝试调用挂起函数以获取其结果作为参数时,如下所示:
fun someLiveData = getResultLiveData(doSomething())
getResultLiveData
:
Suspend function doSomething() should be called only from a coroutine or another suspend function
这显然是有道理的,但是我如何将我的 getResultLiveData 的参数注释为挂起函数的结果?
现在,如果我要执行以下操作:
fun getResultLiveData(): LiveData<Result> = liveData(Dispatchers.IO) {
emit(doSomething())
}
它会起作用,因为它是在函数的暂停部分(即 LiveDataScope
)的范围内调用的。但我只想更进一步抽象...
正如@CommonsWare 所建议的,解决方案是传递一个挂起函数本身,而不是函数的结果作为参数。当挂起函数有参数时,这也有效。
getResultLiveData
函数应如下所示:
fun getResultLiveData(resourceFunction: suspend () -> Result): LiveData<Result> = liveData(Dispatchers.IO) {
emit(resourceFunction())
}
然后您可以轻松地在 lambda 表达式中调用该函数:
getResultLiveData{doStuff(param1, param2)}
或者干脆
getResultLiveData{doStuff()}