[英]Nesting Futures in Play Action
我正在使用Play并采取行动,我想做两件事: -
由于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.