使用协程使函数返回在回调中获得的值

路易斯·费尔南德斯(Luis Fernandez)

我对异步开发和特别是协程不是很熟悉。我要说的基本上是,我什至不知道我要实现的目标是否可行。

我有一个方法sendAudioMessage,我想返回一个字符串。这是(模糊的)代码:

override suspend fun sendAudioMessage(): String {
   // ... Do some stuff
   val listener: WebSocketUtils.Listener = object: WebSocketUtils.Listener {
      // ... some (not relevant) functions
      override fun onDisconnect(code: Int, reason: String?) {
         //Do some stuff
         return "myResult -> $code" //This obviously doesn't compile since is trying to make onDisconnect return a string instead of Unit
      }
   }
}

然后我想这样称呼它:

override fun send(request: String) {
    CoroutineScope(IO).launch {
        val response = d.sendAudioMessage()
        analyzeResponse( response, request )
    }
}

这有可能吗?如果是这样,我该如何实现?

格伦·桑多瓦尔(Glenn Sandoval)

您需要将回调包装在一个suspendCancellableCoroutine块中,以便将您的阻塞API调用转换为挂起函数,以便可以从协程调用它。它是这样的:

suspend fun sendAudioMessage(): String = suspendCancellableCoroutine { continuation ->
    WebSocketUtils.Listener {
        // ... some (not relevant) functions
        override fun onDisconnect(code: Int, reason: String?) {
            //Do some stuff
            when (code) {
                OK -> continuation.resume("myResult -> $code")
                ERROR -> continuation.resumeWithException(Exception(reason))
            }
        }
    }
}

当API调用成功返回时,您可以将结果返回给协程调用,continuation.resume并以结果作为参数。

当API调用返回错误时,您可以引发异常调用continuation.resumeWithException

现在,您可以sendAudioMessage在协程内部调用并照常使用其结果:

class MyClass: CoroutineScope by CoroutineScope(Dispatchers.Default) {
    
    ...
    
    override fun send(request: String) {
        launch(Dispatchers.IO) {
            val response = d.sendAudioMessage()
            analyzeResponse(response, request)
        }
    }
    
    ...
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从Python中的回调返回值

来自分类Dev

如何包装回调函数以在WinJS中获得承诺?

来自分类Dev

NodeJS获得异步返回值(回调)

来自分类Dev

在回调中使用返回值

来自分类Dev

Python asyncio:函数或协程,使用哪个?

来自分类Dev

如何从函数内的回调返回值?

来自分类Dev

如何在JS异步回调函数中返回值-GAPI

来自分类Dev

Kotlin协程列表返回空值

来自分类Dev

如何返回依赖于方法中启动的协程结果的值?(C#)

来自分类Dev

如何在Android的生命周期感知协程范围中返回函数值?

来自分类Dev

皮卡:如何从回调函数获取返回值?

来自分类Dev

用电子返回多个回调函数中的值时出错

来自分类Dev

如何从协程范围返回值

来自分类Dev

将需要回调的函数调用转换为协程

来自分类Dev

关于在Firebase云函数中的诺言的然后回调中返回空值的问题

来自分类Dev

如何在暂停的协程流中使用回调?

来自分类Dev

函数无法使用协程块返回项目

来自分类Dev

将变量设置为从回调函数返回的值

来自分类Dev

格式化回调函数返回的值

来自分类Dev

如何从函数中返回值,该值是在内部的回调函数中生成的?

来自分类Dev

如何获得在C ++中使用C回调返回的结果

来自分类Dev

等待节点js中的函数或回调返回值

来自分类Dev

Node.JS函数返回异步回调函数的值

来自分类Dev

要求提供示例代码以了解协程中throw()的返回值,该协程返回值

来自分类Dev

如何从 ECMAS6 中的回调函数返回一个值

来自分类Dev

从回调函数返回主函数的值

来自分类Dev

如何正确使用协程和回调?从 IEnumerator 中检索数组

来自分类Dev

如何使用任何 JavaScript 数组函数在回调时从数组中返回特定元素的索引和值?

来自分类Dev

Unity 获取在协程中设置的值

Related 相关文章

  1. 1

    从Python中的回调返回值

  2. 2

    如何包装回调函数以在WinJS中获得承诺?

  3. 3

    NodeJS获得异步返回值(回调)

  4. 4

    在回调中使用返回值

  5. 5

    Python asyncio:函数或协程,使用哪个?

  6. 6

    如何从函数内的回调返回值?

  7. 7

    如何在JS异步回调函数中返回值-GAPI

  8. 8

    Kotlin协程列表返回空值

  9. 9

    如何返回依赖于方法中启动的协程结果的值?(C#)

  10. 10

    如何在Android的生命周期感知协程范围中返回函数值?

  11. 11

    皮卡:如何从回调函数获取返回值?

  12. 12

    用电子返回多个回调函数中的值时出错

  13. 13

    如何从协程范围返回值

  14. 14

    将需要回调的函数调用转换为协程

  15. 15

    关于在Firebase云函数中的诺言的然后回调中返回空值的问题

  16. 16

    如何在暂停的协程流中使用回调?

  17. 17

    函数无法使用协程块返回项目

  18. 18

    将变量设置为从回调函数返回的值

  19. 19

    格式化回调函数返回的值

  20. 20

    如何从函数中返回值,该值是在内部的回调函数中生成的?

  21. 21

    如何获得在C ++中使用C回调返回的结果

  22. 22

    等待节点js中的函数或回调返回值

  23. 23

    Node.JS函数返回异步回调函数的值

  24. 24

    要求提供示例代码以了解协程中throw()的返回值,该协程返回值

  25. 25

    如何从 ECMAS6 中的回调函数返回一个值

  26. 26

    从回调函数返回主函数的值

  27. 27

    如何正确使用协程和回调?从 IEnumerator 中检索数组

  28. 28

    如何使用任何 JavaScript 数组函数在回调时从数组中返回特定元素的索引和值?

  29. 29

    Unity 获取在协程中设置的值

热门标签

归档