Intellij进行了一项检查(即检查棉绒),该检查告诉您返回Deferred
的函数应命名为以Async
结尾的名称。
在动态类型化的语言中,这样的命名约定对我来说很有意义。但是Kotlin具有如此出色的类型检查器和工具生态系统,那么为什么要依赖该约定?
尤其是因为Kotlin协程烘烤了structured concurrency,该函数可能还会采用一个CoroutineScope
参数,该参数将在调用站点提供相同的视觉提示:
suspend fun doStuff() = coroutineScope {
doStuffAsync(this /* CoroutineScope */).await()
//...
}
作为旁注,我了解检查的消息,即您几乎不希望使用返回Deferred
而不是suspend
函数的函数。那不是我的问题。我的问题是假设您知道自己在做什么,并且想要Deferred
。
答案 0 :(得分:0)
Deferred不会返回实际值,而是“轻量级的无阻塞未来,表示有望在以后提供结果”。
由于您无法从方法名称中看到此内容,因此“我们使用“ ... Async”后缀来命名此类函数,以突出表明它们仅开始异步计算,并且需要使用所得的递延值来获得结果这一事实”
因此,您的代码阅读器可以立即看到您的方法未返回实际值,但还必须在其上调用await()
。
关于suspend
函数的第二点:
通常情况相反,xyzAsync()
函数调用suspend xyz()
函数。
返回Deferred
的函数可以在任何地方调用,而不仅仅是挂起函数。