我仍然在學習Scala所以這可能是一個易於回答的問題,但我一直停留在一遍又一遍地寫一個方法幾乎一天,無法得到這個代碼進行編譯。檢查錯誤/休息
我玩播放框架和反應蒙戈模板學習如何Scala和播放工作。 我有一個控制器與幾個方法,REST服務的端點。
的問題是關於下述方法,它接受JSON對象的列表,並使用該反應性蒙戈駕駛員更新這些對象。所述類具有一個部件,citiesFuture
這是Future[JSONCollection]
類型。 這我加入這個方法的原始類的代碼可以在這裏找到適合情境:CityController on github
def updateAll() = Action.async(parse.json) { request =>
Json.fromJson[List[City]](request.body) match {
case JsSuccess(givenCities, _) =>
citiesFuture onComplete[Future[Result]] { cities =>
val updateFutures: List[Future[UpdateWriteResult]] = for {
city <- givenCities
} yield cities.get.update(City.getUniqueQuery(city), Json.obj("$set" -> city))
val promise: Promise[Result] = Promise[Result] {
Future.sequence(updateFutures) onComplete[Result] {
case [email protected](_) =>
var count = 0
for {
updateWriteResult <- s.value
} yield count += updateWriteResult.n
promise success Ok(s"Updated $count cities")
case Failure(_) =>
promise success InternalServerError("Error updating cities")
}
}
promise.future
}
case JsError(errors) =>
Future.successful(BadRequest("Could not build a city from the json provided. " + Errors.show(errors)))
}
}
我已經成功地走到這一步有很多的試驗和錯誤,但我開始明白怎麼有些Scala和期貨的機制的工作,我覺得:)我認爲我接近,但我的IDE仍然給我一個檢驗錯誤只是在單結束大括號行promise.future
以上。
錯誤消息:類型單元的表達式不符合預期類型Nothing。 我已經檢查了Promise和onComplete代碼塊的預期返回值,但我不認爲他們期望Nothing作爲返回類型。
可能有人請向我解釋什麼,我缺少的,而且,我敢肯定,這是可以做的更好,所以讓我知道你是否有我可以學習任何提示!
爲什麼在已經有'Future'的地方使用'Promise.future'?似乎沒有道理。 – cchantep
因爲行動需要一個'未來[結果]'我認爲這是唯一的方法,構建一個新的未來完成所有更新後完成。 – semvdwal