为什么对返回Deferred的函数使用* Async命名约定?

时间:2019-03-11 18:35:42

标签: kotlin kotlin-coroutines

Intellij进行了一项检查(即检查棉绒),该检查告诉您返回Deferred的函数应命名为以Async结尾的名称。

enter image description here

在动态类型化的语言中,这样的命名约定对我来说很有意义。但是Kotlin具有如此出色的类型检查器和工具生态系统,那么为什么要依赖该约定?

尤其是因为Kotlin协程烘烤了structured concurrency,该函数可能还会采用一个CoroutineScope参数,该参数将在调用站点提供相同的视觉提示:

suspend fun doStuff() = coroutineScope {
  doStuffAsync(this /* CoroutineScope */).await()
  //...
}

作为旁注,我了解检查的消息,即您几乎不希望使用返回Deferred而不是suspend函数的函数。那不是我的问题。我的问题是假设您知道自己在做什么,并且想要Deferred

1 个答案:

答案 0 :(得分:0)

Deferred不会返回实际值,而是“轻量级的无阻塞未来,表示有望在以后提供结果”。

由于您无法从方法名称中看到此内容,因此“我们使用“ ... Async”后缀来命名此类函数,以突出表明它们仅开始异步计算,并且需要使用所得的递延值来获得结果这一事实”

因此,您的代码阅读器可以立即看到您的方法未返回实际值,但还必须在其上调用await()


关于suspend函数的第二点:

通常情况相反,xyzAsync()函数调用suspend xyz()函数。

返回Deferred的函数可以在任何地方调用,而不仅仅是挂起函数。