将 suspendCancellableCoroutine 转换为callbackFlow

问题描述 投票:0回答:2

我有以下功能。

 suspend fun result() = suspendCancellableCoroutine<Int> {continuation ->
      val callback = object : Callback {
            continuation.resume(value)
      }
 }

然后我在协程中调用结果,如下所示:

 someCoroutine {
     when (result()){
          x -> doSomething
          y -> doSomething
           ...
     }
 }

它有效,但再次调用时我不断收到错误:

未捕获的异常:已恢复,但建议更新。

我想我需要一个callbackFlow,但我不太确定如何实现它。这是我到目前为止所拥有的。

 suspend fun result() = callbackFlow<Int> {
      val callback = object : Callback {
            trySendBlocking(value)
      }
      awaitClose()
 }

我猜我必须使用collect(),但我不知道如何在协程中处理它。任何帮助将不胜感激。

kotlin kotlin-coroutines coroutine kotlin-flow
2个回答
2
投票

要使用

Flow
发出的值,您需要使用 终端运算符之一,例如
collect
:

coroutineScope.launch {
   result().collect { value ->
       when (value) {
          x -> doSomething
          y -> doSomething
          ...
       }
   }
}

0
投票

错误

Uncaught exception: Already resumed, but proposed with update.
表示您多次调用
resume
,检查您的回调是否被多次调用?

顺便说一句,通常你需要

continuation.invokeOnCancellation
在协程取消时正确释放资源(回调),请参阅文档了解
suspendCancellableCoroutine
详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.