【发布时间】:2015-04-09 15:07:27
【问题描述】:
我想让我的应用程序尽可能异步。现在我有了这个存储库:
object LanguageRepository extends LanguageRepositoryTrait
{
private val languages = TableQuery[Languages]
private def db:Database = Database.forDataSource(DB.getDataSource())
private def filterQuery(id: Long): Query[Languages, Language, Seq] = languages.filter(_.id === id)
private def filterCode(code: String): Query[Languages, Language, Seq] = languages.filter(_.code === code)
private def all() : Query[Languages, Language, Seq] = languages
override def find(id: Long): Future[Language] =
{
try db.run(filterQuery(id).result.head)
finally db.close()
}
override def find(code: String): Future[Language] =
{
try db.run(filterCode(code).result.head)
finally db.close()
}
override def get(): Future[Seq[Language]] =
{
try db.run(all().result)
finally db.close()
}
}
当我调用像“domain.tld/{language}”这样的 url 时,我想检查给定的语言(代码)是否确实存在。比如,如果该网站没有法语 (fr) 版本,我想抛出异常或 404。
现在,我的问题是整个异步的东西非常酷,虽然我确实想理解它背后的理论,但我现在很困惑。我的意思是,我希望它是非阻塞的(并且是异步的,这就是我使用 Future 和 async 的原因;))
在我的控制器中,我想做类似的事情:
def checkLanguage(language:String) = Action
{
val lang:Future[Language] = languageRepository.find(language)
lang.onComplete
{
case Success(s) = Ok("Yay")
case Failure(f) = 404("Oh no!")
}
}
当然这是行不通的,但这是我想让事情正常工作的模式。我想等待或推迟网站的呈现,直到确认给定的语言代码有效或无效。
我查看了 2.3.6 (https://www.playframework.com/documentation/2.3.6/ScalaAsync) 的 Playframeworks 异步文档,但我无法真正按预期工作。
任何意见表示赞赏!
【问题讨论】:
-
首先,异步!=非阻塞。你为什么说“这行不通”,你的
find返回一个Future[Language]所以它是异步的(但不是非阻塞的)并且你有一个onComplete处理程序来呈现结果。什么不完全有效? -
@vptheron 该方法必须返回一个Action,因此无法编译,因为返回值在“onComplete{}”块中
标签: scala asynchronous playframework slick