我想要的是这样一个函数:

suspendCoroutineWithTimeout(timeout: Long, unit: TimeUnit, crossinline block: (Continuation<T>) -> Unit)

这与现有的suspendCoroutine函数基本相同,但是如果在指定的超时时间内没有调用回调函数或块中提供的任何函数,则corutine会继续,但会出现TimeoutException或类似的情况.

推荐答案

您可以直接将withTimeoutsuspendCancellableCoroutine组合在一起,以获得所需的效果:

suspend inline fun <T> suspendCoroutineWithTimeout(
    timeout: Long, unit: TimeUnit,
    crossinline block: (Continuation<T>) -> Unit
) = withTimeout(timeout, unit) {
    suspendCancellableCoroutine(block = block)
}

Kotlin相关问答推荐

如何为集成测试配置Gradle JVM测试套件?

捕捉异常是Kotlin协程中的反模式吗?

我可以更改方法中泛型类的类型参数边界吗?

垂直滚动条下拉菜单的桌面组合

如何在 Kotlin 中初始化 Short 数组?

如何在 Kotlin 中为类方法调用传递变量

init中的NPE抽象函数变量

异常传播如何在 CoroutineScope.async 上工作?

如何在 Android 的 Fragment 中使用 setUserVisibleHint

Dagger 2 ContributesAndroidInjector 为模块提供活动

JobIntentService 被销毁,当应用程序被销毁时

将 Completable 转换为 Single 的规范方法?

Android Room - error: Cannot figure out how to save this field into database

RecyclerView SnapHelper无法显示第一个/最后一个元素

封闭 lambda 的隐式参数被shadowed

如何使用协调器布局和行为在CardView上完成此动画?

Kotlin - computed var 属性的用处?

导航架构组件 - 未生成 DestinationFragmentArgs

WebFlux 功能:如何检测空 Flux 并返回 404?

在 intelliJ 元素中集成 Kotlinx 协程