【发布时间】:2018-01-02 10:49:16
【问题描述】:
我还在学习 scala,所以这可能是一个很容易回答的问题,但是我几乎一天都被困在一遍又一遍地编写一个方法上,无法编译这段代码。
我正在使用 Play 框架和响应式 mongo 模板来了解 Scala 和 Play 的工作原理。 我有一个控制器,它有几个方法,一个 REST 服务的端点。
问题在于以下方法,它接受 json 对象列表并使用 mongo 反应式驱动程序更新这些对象。该类有一个成员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 s@Success(_) =>
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 和 Futures 的一些机制是如何工作的,我想 :) 我想我已经接近了,但我的 IDE仍然在promise.future 行上方的单个右大括号处给我一个检查错误。
错误内容为:Unit 类型的表达式不符合预期的Nothing 类型。 我检查了 Promise 和 onComplete 代码块的预期返回值,但我不认为他们期望 Nothing 作为返回类型。
有人可以向我解释我缺少什么,而且,我相信这可以做得更好,所以如果你有任何可以学习的技巧,请告诉我!
【问题讨论】:
-
为什么在已经有
Future的地方使用Promise.future?似乎没有意义。 -
因为 Action 需要
Future[Result],所以我认为这是构建一个新的 Future 并在所有更新完成后完成的唯一方法。
标签: scala playframework