我有一個這樣的端點:嵌套的異步調用
POST /user/:id/addData
而且控制器功能如下:
def addData(id: Int) = Action.async { implicit request =>
// AsynC#1 - Make sure this user exists
usersDAO.get(id).map(user => {
is(user.isEmpty) {
BadRequest("That user doesn't exist")
} else {
val body = request.body.asJson.get.as[JsObject]
// Data processing here ...
// AsynC#2 - Insert some data from the POST body
(for {
foo <- fooDAO.insert(fooData)
bar <- barDAO.insert(barData)
} yield (foo, bar)).map {
case options => Ok("Data was added!")
}.recover { // <-------------------------- Compilation error here
case e => BadRequest(e)
}
}
})
}
我得到一個編譯時錯誤:
type mismatch;
found : scala.concurrent.Future[play.api.mvc.Result]
required: play.api.mvc.Result
我相信這個錯誤是因爲執行上下文在第一個異步調用(又名一個未來)中,所以,因爲我正在輸入另一個異步調用,就像我返回嵌套的期貨一樣。
這樣做的正確方法是什麼?如果可能的話,我想取消這些調用的嵌套(如Promises in Javascript)。