我正在尝试使用Play2和reactivemongo在mongodb中找到一个可用的slug。 我提出了以下递归方法。
private def findSlug(base: String, index: Int): String = {
val slug: String = Slug({
base + "-" + index
})
for {
user <- findOne(BSONDocument("slug" -> slug))
} yield {
user match {
case None => slug
case Some(user) => findSlug(base, index+1)
}
}
}
我收到以下错误
found : scala.concurrent.Future[String]
required: String
user <- findOne(BSONDocument("slug" -> slug))
^
我通过改变返回类型,映射产量的结果等来玩了很多,但不知何故,我认为可能有一个更简单,更简洁和正确的解决方案。 这一切都归结为有一个递归函数,我认为调用另一个异步函数。
如果我将findSlug的返回类型更改为Future [String],我得
[error] found : scala.concurrent.Future[String]
[error] required: String
[error] case Some(user) => findSlug(base, index+1)
[error] ^
什么是正确和惯用的解决方案?
答案 0 :(得分:1)
我个人认为将返回类型设为Future[String]
是正确的方法 - 这意味着你可以保持整个“反应性”,monadic,连锁期货的事情尽可能长时间(并且使用Play 2,可以一直到Controller级别 - 真棒)。
我假设你的findOne()
方法只是某些Reactive Mongo查询的包装器,它会在某个时候返回Future[Option[T]]
吗?
考虑到这一点,唯一真正的问题是来自两个不同Future
的{{1}} y-ness的不同级别。
这就是我想出的。有用;这是惯用的吗?你告诉我......
case