【问题标题】:Wait for async result inside synchronous function在同步函数中等待异步结果
【发布时间】:2020-10-20 04:46:53
【问题描述】:

我需要在异步回调中返回一个值。该值是作为 websocket 确认异步获取的,在检索到该值之前,我无法找到阻止该回调执行的方法...我尝试了所有协程组合均无济于事。

override fun someAsyncCallback() : String 
{
   var myAsyncValue = ""

   socket.emit(event = "someEvent", callback = { result ->
       //This is an asynchronous callback
       myAsyncValue = result
   })

   //Insert way to wait for the async value to be set 
   
   return myAsyncValue
}

【问题讨论】:

  • 这个函数可以是挂起函数吗?你用的是哪个网络库?
  • @Tenfour04 它不能是挂起函数,因为需要从协程中调用,并且顶层回调不在协程中运行。我正在使用 socket.io。

标签: android kotlin concurrency socket.io kotlin-coroutines


【解决方案1】:

大概该函数是从可以阻塞的线程调用的。您可以使用 CountDownLatch 等待它。

override fun someAsyncCallback() : String 
{
   var myAsyncValue = ""
   val latch = CountDownLatch(1)

   socket.emit(event = "someEvent", callback = { result ->
       myAsyncValue = result
       latch.countDown()
   })

   latch.await()
   
   return myAsyncValue
}

您还可以将超时传递给latch.await() 方法,这样就不会无限期地阻塞。

【讨论】:

  • 我已经尝试了CountDownLatch,但没有奏效。当线程被阻塞时,事件回调永远不会触发。
  • 如果将socket.emit 调用封装在thread { } 中会怎样?
  • 同样,即使socket.emit 从另一个线程启动,回调也不会触发。似乎套接字确认回调总是发生在原始线程上,这意味着任何中断都会阻止它运行......
  • 好的,所以也许不是在调用线程上运行回调,而是使用对调用此接口方法的任何线程的缓存引用。在那种情况下,我不知道如何解决它。我不使用 socket.io。
猜你喜欢
  • 1970-01-01
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多