scala.concurrent.Future[play.api.mvc.Result] 要求:play.api.mvc.Result
scala.concurrent.Future[play.api.mvc.Result] required: play.api.mvc.Result
我想要一个 Action.async (1) 尝试从数据库中获取值。如果数据库不可用,它将尝试连接到另一个资源并 (2) 从那里获取值。因为我正在使用 return Future 的两个资源,所以我用 "recover" 关键字将它们分开。我不确定这是否是最好的方法.....但是recovery{}里面的语句有一个类型不匹配的错误:
def show(url: String) = Action.async { implicit request: Request[AnyContent] =>
println("url: " + url)
val repositoryUrl = RepositoryUrl(url)
val repositoryId = RepositoryId.createFromUrl(url)
// Listing commits from the DB
val f: Future[Seq[Commit]] = commit.listByRepository(repositoryId.toString())
f.map { f: Seq[Commit] =>
val json = JsObject(Seq(
"project URL" -> JsString(url),
"list of commits" -> Json.toJson(f)))
Ok(json)
}.recover {
case e: scala.concurrent.TimeoutException =>
// InternalServerError("timeout")
// Listing commits from the Git CLI
val github = rules.GitHub(repositoryUrl)
val seq: Future[Seq[Commit]] = github.listCommits
seq.map { seq: Seq[Commit] =>
val json = JsObject(Seq(
"project URL" -> JsString(url),
"list of commits" -> Json.toJson(seq)))
Ok(json)
}
}
}
我在 seq.map { seq: Seq[Commit] =>
行收到错误 type mismatch; found : scala.concurrent.Future[play.api.mvc.Result] required: play.api.mvc.Result
。如果我的未来失败了,我怎么能return另一个结果?
谢谢!
Scala Future.recover
的签名是
def recover[U >: T](pf: PartialFunction[Throwable, U])(implicit executor: ExecutionContext): Future[U]
尝试改用recoverWith
def recoverWith[U >: T](pf: PartialFunction[Throwable, Future[U]])(implicit executor: ExecutionContext): Future[U]
recover
将普通结果包装在 Future 中(类似于 map),而 recoverWith
期望 Future 作为结果(类似于 flatMap)。 ()。所以,你应该使用 recoverWith
:
def show(url: String): EssentialAction = Action.async { implicit request: Request[AnyContent] =>
// This future will throw ArithmeticException because of division to zero
val f: Future[Seq[Int]] = Future.successful(Seq[Int](1, 2, 3, 4 / 0))
val fResult: Future[JsObject] = f.map { r =>
JsObject(Seq(
"project URL" -> JsString(url),
"list of commits" -> Json.toJson(r)))
}.recoverWith {
case e: ArithmeticException =>
val seq: Future[Seq[Int]] = Future.successful(Seq(1, 2, 3, 4))
seq.map { seq: Seq[Int] =>
JsObject(Seq(
"project URL" -> JsString(url),
"list of commits" -> Json.toJson(seq)))
}
}
fResult.map { r =>
Ok(r)
}
}
我想要一个 Action.async (1) 尝试从数据库中获取值。如果数据库不可用,它将尝试连接到另一个资源并 (2) 从那里获取值。因为我正在使用 return Future 的两个资源,所以我用 "recover" 关键字将它们分开。我不确定这是否是最好的方法.....但是recovery{}里面的语句有一个类型不匹配的错误:
def show(url: String) = Action.async { implicit request: Request[AnyContent] =>
println("url: " + url)
val repositoryUrl = RepositoryUrl(url)
val repositoryId = RepositoryId.createFromUrl(url)
// Listing commits from the DB
val f: Future[Seq[Commit]] = commit.listByRepository(repositoryId.toString())
f.map { f: Seq[Commit] =>
val json = JsObject(Seq(
"project URL" -> JsString(url),
"list of commits" -> Json.toJson(f)))
Ok(json)
}.recover {
case e: scala.concurrent.TimeoutException =>
// InternalServerError("timeout")
// Listing commits from the Git CLI
val github = rules.GitHub(repositoryUrl)
val seq: Future[Seq[Commit]] = github.listCommits
seq.map { seq: Seq[Commit] =>
val json = JsObject(Seq(
"project URL" -> JsString(url),
"list of commits" -> Json.toJson(seq)))
Ok(json)
}
}
}
我在 seq.map { seq: Seq[Commit] =>
行收到错误 type mismatch; found : scala.concurrent.Future[play.api.mvc.Result] required: play.api.mvc.Result
。如果我的未来失败了,我怎么能return另一个结果?
谢谢!
Scala Future.recover
的签名是
def recover[U >: T](pf: PartialFunction[Throwable, U])(implicit executor: ExecutionContext): Future[U]
尝试改用recoverWith
def recoverWith[U >: T](pf: PartialFunction[Throwable, Future[U]])(implicit executor: ExecutionContext): Future[U]
recover
将普通结果包装在 Future 中(类似于 map),而 recoverWith
期望 Future 作为结果(类似于 flatMap)。 (recoverWith
:
def show(url: String): EssentialAction = Action.async { implicit request: Request[AnyContent] =>
// This future will throw ArithmeticException because of division to zero
val f: Future[Seq[Int]] = Future.successful(Seq[Int](1, 2, 3, 4 / 0))
val fResult: Future[JsObject] = f.map { r =>
JsObject(Seq(
"project URL" -> JsString(url),
"list of commits" -> Json.toJson(r)))
}.recoverWith {
case e: ArithmeticException =>
val seq: Future[Seq[Int]] = Future.successful(Seq(1, 2, 3, 4))
seq.map { seq: Seq[Int] =>
JsObject(Seq(
"project URL" -> JsString(url),
"list of commits" -> Json.toJson(seq)))
}
}
fResult.map { r =>
Ok(r)
}
}