处理Kotlin函数参数中的挂起和非挂起

时间:2019-09-27 11:48:40

标签: kotlin kotlin-coroutines suspend

对于Kotlin来说,我还很陌生,并且开始了解它的协同例程实现。我知道我们可能希望Kotlin以非阻塞方式处理的任何功能都必须用suspend进行注释,并且这些功能只能在协同例程(或另一个暂停函数)中执行。 。到目前为止一切顺利。

但是,我仍然遇到实用程序功能的问题,这些功能接受其他功能作为参数。例如,使用arrow的Try:

suspend fun somethingAsync() = 1 + 1

Try { 1 + 1 } // All is well
Try { somethingAsync() } // Uh oh....

由于Try的调用函数/运算符的参数未使用suspend注释,因此第二次调用将被编译器拒绝。在编写不知道所传递函数或lambda中的代码是否需要挂起的实用程序函数时,有人如何处理?编写每个此类函数的挂起和非挂起版本似乎非常繁琐。我是否错过了处理这种情况的明显方法?

1 个答案:

答案 0 :(得分:1)

首先,让我们处理suspend。这意味着该特定功能块。并不是说这个函数是异步的。
通常,阻塞表示IO,但并非总是如此。在您的示例中,该函数不会阻塞,也不会以异步方式起作用(因此,Async后缀在那里不正确)。但是让我们假设实际的实用程序代码确实由于某种原因而阻塞了。

现在处理挂起功能是在调用方完成的。意思是,执行此操作时您想做什么:

fun doSomething() {
    Try { somethingAsync() }
}

如果您可以使用doSomething进行屏蔽,则可以使用runBlocking

fun doSomething() = runBlocking {
    Try { somethingAsync() }
}