gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:52:45 25 4
gpt4 key购买 nike

我是 Kotlin 的新手,正在掌握它的协同例程实现。我明白我们可能希望 Kotlin 以非阻塞方式处理的任何函数都需要用 suspend 注释,并且这样的函数只能在协程中执行(或在另一个暂停功能)。到目前为止一切顺利。

但是,我不断遇到接受其他函数作为参数的实用函数的问题。例如箭头的尝试:

suspend fun somethingAsync() = 1 + 1

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

由于 Try 的 invoke 函数/操作符的参数没有用 suspend 注释,第二次调用将被编译器拒绝。在编写不知道传递的函数或 lambda 中的代码是否需要暂停的实用程序函数时,有人如何处理这个问题?为每个此类函数编写一个挂起和非挂起版本似乎非常乏味。我是否错过了处理这种情况的明显方法?

最佳答案

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

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

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

如果您可以使用 doSomething 来阻止,那么您可以使用 runBlocking:

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

关于kotlin - 处理 Kotlin 函数参数中的挂起和非挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58133959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com