因爲我第一次使用Play 2進行開發,我發現我在我的控制器中做了很多事情(其中一個更簡單的例子) :多個數據庫訪問與多個Akka.futures VS包裝數據庫訪問在單一的未來
val promUser = Akka.future(UserService.findByUsername(access.username))
Async(
promUser.map {
_.map{
user => {
val promService = Akka.future(ServiceService loadOnlyWithUser (id,user.id.get))
Async(
promService.map { _.map { service =>
Ok(toJson(service))
}.getOrElse(BadRequest("not accessible"))}
)
}
}.getOrElse {
BadRequest("unauthorised")
}
}
)
單身將來會更好嗎?例如:
val promService = Akka.future{
val userOption = UserService.findByUsername(access.username)
userOption.map(user => {
ServiceService loadOnlyWithDeveloper (id,user.id.get)
}).getOrElse(None)
}
Async(
promService.map { _.map { service =>
Ok(toJson(service))
}.getOrElse(BadRequest("unauthorised"))}
)
我想一方面是許多期貨/返回到控制器可能會增加開銷,就拱手組呼叫成一個未來將更具可讀性,但導致較大的「線程」運行在Akka系統中。對於更大的工作我有一個額外的Akka系統,所以這些只會包含最多4個SQL事務。至於我可以從Apache板凳工作,上面的例子之間沒有任何區別......有什麼我失蹤了?
謝謝,這是非常翔實的 – paullth
沒問題!我只想快速地說我在for-comprehension示例中詳述的User.findById()函數返回Future(scala.concurrent.Future)。在Scala 2.10和Play 2.1中,您不需要編寫Akka.future,您可以直接在Scala中使用Future,因爲Future的所有第三方實現(包括Akka)都已移入Scala標準庫。 – alex