如果我在一个Action中发出3种不同类型的请求,如果它们都有自己的执行上下文,我该如何处理呢?这种类型的场景是否有最佳实践?
我需要执行以下操作:
所以说我的行为看起来像我有3个不同的执行背景,请纠正我错误的地方:
def userProfile = Action.async {
Future {
// db
}(Contexts.myDbEC)
Future {
// redis calls
}(Contexts.myRedisEC)
Future {
// memcache calls
}(Contexts.myMemcacheEC)
}
答案 0 :(得分:1)
如果你想让你的Action异步然后返回 a Future,Action.async的使用是正确的。
对于您的第二个问题,假设您想要检索一个未来的结果并与另一个结合? - 您可以使用flatMap或foreach撰写期货。
根据您的示例,您可以收集未来的结果并使用理解来收集结果。
val future1 = future{ //db call }
val future2 = future{ //redis call}
val future3 = future{//memcache call}
val res = for{
r1 <- future1
r2 <- future2
r3 <- future3
} yield(r1+r2+r3)
注意:如上所述,将这些期货运行到外面以便并行运行它们非常重要。如果你这样做,那么它们将按顺序运行。
val res = for{
r1 <- future{//db call}
r2 <- future{//redis call}
r3 <- future{//memcache call}
}