我仍然在学习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