首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AsyncRestTemplate +协程

AsyncRestTemplate +协程
EN

Stack Overflow用户
提问于 2020-04-07 05:56:42
回答 1查看 104关注 0票数 0

我知道AsyncRestTemplate已经被弃用了,但不管怎样。我写这样的代码把AsyncRestTemplate和协程结合在一起,这样做对吗?

代码语言:javascript
复制
   suspend fun dodo(url: URL): String {
      val result = AsyncRestTemplate().getForEntity(url, String::class.java)
      return result.awaitBody()
   }

   suspend fun <T> ListenableFuture<ResponseEntity<T>>.awaitBody(): T {
      while (this.isDone.not)
         yield()
      return this.get().body!!
   }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-07 07:04:02

您的代码是正确的,但效率很低,因为它实际上是一个重复调用ListenableFuture.isDone直到完成的忙等待循环。

当您需要在异步API和挂起函数之间进行转换时,请使用提供的回调API:

代码语言:javascript
复制
suspend fun <T> ListenableFuture<T>.await(): T = suspendCancellableCoroutine { cont ->
    // Special handling for Future<*> objects
    cont.cancelFutureOnCancellation(this)

    addCallback(object : ListenableFutureCallback<T> {
        override fun onFailure(ex: Throwable) {
            cont.resumeWithException(ex)
        }

        override fun onSuccess(result: T) {
            cont.resume(result)
        }
    })
}

这不会浪费时间检查将来是否完成,而只是在结果实际可用时告诉将来恢复挂起的函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61069589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档