我有一个使用Scala Async库的服务。我主要使用这个库来计算数据库调用时间。我想测试的方法包含使用async await机制对数据库的多次调用。我所拥有的伪代码如下:
def myDbMethod() = async {
val firstCall = await(call the db and get the result)
val secondCall = await(all the db and get the result)
val thirdCall = await(all the db and get the result)
...
}
在我的Scala测试单元测试中,我有
Await.result(myDbMethod(), 10.seconds)
我只是试图通过运行我的单元测试来调试myMethod,该单元测试即使在进入secondCall之前也会以测试成功返回。我的意思是我在对数据库的所有3次调用中都有断点,但IntelliJ调试器只要完成对数据库的第一次调用就会退出。为什么是这样?如何使用IntelliJ调试器测试此行为?
答案 0 :(得分:2)
我不确定我的答案是否满足您的期望,但这是一个已知问题。问题是async
/ await
是一个非常复杂的宏,它会对树进行大量转换(您可以通过启用-Xprint:<phase_name_after_typer>
标志来检查输出)。不幸的是,现有的IDE(我都没有使用Intellij和Ensime)都可以调试它,但是我不熟悉它们的内部结构来解释为什么它们不能详细说明。
根据我的经验,我无法找到任何关于本机理解的优秀专业人员,因此您可以坚持使用原生语法或显式平面图调用,这样可以很好地调试。
答案 1 :(得分:0)
此构造可用于depdesndant异步调用。 async / await添加了一些糖来使这更容易,但要手工制作,你可以这样做:
def dbMethodDependant : Future[T] = for {
res1 <- firstCall
res2 <- secondCall(res2)
res3 <- thirdCall(res3)
} yield res3
Await.result(dbMethodDependant, forever)