我想运行以并行挂起函数,并在其中一个函数返回结果较快时返回结果. 我try 执行以下操作,但我认为只有当两个操作都完成时才会返回,而且这需要太多时间,因为我正在等待这两个操作.

val coroutineScope = CoroutineScope(Dispatchers.Main)
val a = coroutineScope.async {
    a(context)
}
val b = coroutineScope.async {
    b(context)
}

val results = listOf(a, b).awaitAll()

return if (results.any { it is RunSuccess }) {
    ...
} else {
    ...
}

有什么主意吗?

推荐答案

您可以使用select,如下所示:

suspend fun doWork(): String = coroutineScope {
   select<String> {
      async { work1() }.onAwait { it }
      async { work2() }.onAwait { it }
   }.also {
      coroutineContext.cancelChildren()
   }
}

在本例中,返回的是String,但您可以随意更改它,这取决于您的work返回什么.

如果您正在寻找更多的functional programming版本,您可以使用raceNArrow

你有这种方法的地方

public suspend inline fun <A, B> raceN(crossinline fa: suspend CoroutineScope.() -> A, crossinline fb: suspend CoroutineScope.() -> B): Either<A, B> =
  raceN(Dispatchers.Default, fa, fb)

然后你调用这个raceN方法

public suspend inline fun <A, B> raceN(
  ctx: CoroutineContext = EmptyCoroutineContext,
  crossinline fa: suspend CoroutineScope.() -> A,
  crossinline fb: suspend CoroutineScope.() -> B
): Either<A, B> =
  coroutineScope {
    val a = async(ctx) { fa() }
    val b = async(ctx) { fb() }
    select<Either<A, B>> {
      a.onAwait.invoke { Either.Left(it) }
      b.onAwait.invoke { Either.Right(it) }
    }.also {
      when (it) {
        is Either.Left -> b.cancelAndJoin()
        is Either.Right -> a.cancelAndJoin()
      }
    }
  }

Android相关问答推荐

在画布上画直线

在Android Studio Iguana 2023.2.1中,哪里可以找到能量分析器?

合成-删除图像的部分背景

Jetpack Compose-如何使用值动画直接控制其他动画

DocumentFile.canWrite()、DocumentFile.Existes()-使用本地内置手机存储(而不是云)时性能较差(占用太多CPU时间)

FireBase Android ChildEventListener在被规则拒绝时触发(RTDB)

当按下通知时,将Android应用程序置于前台

插入视图模型时,dagger 未命中绑定错误

Jetpack Compose-如何在进入新产品线之前删除单词?

如何共享没有';t是否存在?(仅信息)在Android?

Android 不在后台更新位置

如何在 Jetpack Compose 中对齐按钮底部中心?

如何从 firebase 实时数据库中检索最后一个值

围绕动态大小的内容包装 Jetpack Compose Row?

Android Studio电鳗:javaHome好像无效

如何让这个三角形指示器在 android jetpack compose 中旋转和移动?

Jetpack Compose Alignment - 误解了 alignBy 修饰符

为 AlertDialog 的消息文本设置自定义字体

升级到 android studio 花栗鼠后,应用程序未安装在模拟器中

Android TTS 在屏幕关闭一段时间后停止朗读