如何将挂起函数的结果传递给非挂起函数?

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()}