对于Kotlin来说,我还很陌生,并且开始了解它的协同例程实现。我知道我们可能希望Kotlin以非阻塞方式处理的任何功能都必须用suspend
进行注释,并且这些功能只能在协同例程(或另一个暂停函数)中执行。 。到目前为止一切顺利。
但是,我仍然遇到实用程序功能的问题,这些功能接受其他功能作为参数。例如,使用arrow的Try:
suspend fun somethingAsync() = 1 + 1
Try { 1 + 1 } // All is well
Try { somethingAsync() } // Uh oh....
由于Try的调用函数/运算符的参数未使用suspend注释,因此第二次调用将被编译器拒绝。在编写不知道所传递函数或lambda中的代码是否需要挂起的实用程序函数时,有人如何处理?编写每个此类函数的挂起和非挂起版本似乎非常繁琐。我是否错过了处理这种情况的明显方法?
答案 0 :(得分:1)
首先,让我们处理suspend
。这意味着该特定功能块。并不是说这个函数是异步的。
通常,阻塞表示IO,但并非总是如此。在您的示例中,该函数不会阻塞,也不会以异步方式起作用(因此,Async
后缀在那里不正确)。但是让我们假设实际的实用程序代码确实由于某种原因而阻塞了。
现在处理挂起功能是在调用方完成的。意思是,执行此操作时您想做什么:
fun doSomething() {
Try { somethingAsync() }
}
如果您可以使用doSomething
进行屏蔽,则可以使用runBlocking
:
fun doSomething() = runBlocking {
Try { somethingAsync() }
}