库函数是否应该挂起或返回延迟

asc*_*sco 3 kotlin kotlin-coroutines

假设我正在编写一个库,它返回一个字符串,这是一个复杂且长时间运行的任务。

我可以选择提供这个

interface StringGenerator {
   suspend fun generateString(): String
}
Run Code Online (Sandbox Code Playgroud)

或者

interface StringGenerator {
   fun generateString(): Deferred<String>
}
Run Code Online (Sandbox Code Playgroud)

这两种选择是否有任何(缺点)优点,它们是什么?我应该选择哪个?

Mar*_*nik 8

Kotlin 协程是按照“默认顺序”准则设计的。这意味着您的 API 应该始终公开suspend funs 并且用户,如果他们真的需要它,可以轻松地将它们包装在async.

其优点类似于冷流相对于热流的优点:可暂停功能仅在控制处于其中时才处于活动状态。当它返回时,它并没有留下在后台运行的任务。

每当您返回 a 时Deferred,用户必须开始担心如果他们无法等待结果会发生什么。一些代码路径可能会忽略它,调用代码可能会出现异常,然后它们的应用程序就会发生泄漏。