繁体   English   中英

在游戏行动中嵌套期货

[英]Nesting Futures in Play Action

我正在使用Play并采取行动,我想做两件事: -

  1. 首先检查我的缓存中的值
  2. 其次,使用该值调用Web服务

由于WS API返回Future ,我正在使用Action.async
我的Redis缓存模块也返回Future

假设我正在为可能长时间运行的任务正确使用另一个ExecutionContext。

问:有人可以通过以下方式确认我是否在正确的轨道上。 我知道我没有照顾下面的例外案例 - 只是为了简洁而保持简单。

def token = Action.async { implicit request =>


    // 1. Get Future for read on cache

    val cacheFuture = scala.concurrent.Future {   
        cache.get[String](id)    
    }


    // 2. Map inside cache Future to call web service

    cacheFuture.map { result =>   

        WS.url(url).withQueryString("id" -> result).get().map { response =>
            // process response
            Ok(responseData)
        }

    }

}

我担心的是,这可能不是最有效的做事方式,因为我假设不同的线程可以处理完成每个期货的任务。

我们非常感谢任何有关更好方法的建议。

这不是Play特有的。 我建议你看一下解释Future如何运作的文件。

val x: Future[FutureOp2ResType] = futureOp1(???).flatMap { res1 => futureOp2(res1, ???) }

或者为了理解

val x: Future[TypeOfRes] = for {
  res1 <- futureOp1(???)
  res2 <- futureOp2(res1, ???)
  // ...
} yield res

至于如何执行Future (使用线程),它取决于您使用的ExecutionContext (例如全局的,Play Play,......)。

WS.get返回Future ,它不应该在cacheFuture.map ,否则它将返回Future[Future[...]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM