Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala测试异步和等待方法_Scala_Asynchronous_Async Await - Fatal编程技术网

Scala测试异步和等待方法

Scala测试异步和等待方法,scala,asynchronous,async-await,Scala,Asynchronous,Async Await,我有一个利用Scala异步库的服务。我使用这个库主要是为数据库调用计时。我要测试的方法包含使用异步等待机制对数据库的多个调用。我的伪代码如下所示: 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

我有一个利用Scala异步库的服务。我使用这个库主要是为数据库调用计时。我要测试的方法包含使用异步等待机制对数据库的多个调用。我的伪代码如下所示:

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)

我只是试图通过运行单元测试来调试我的方法,即使在进行第二次调用之前,单元测试也会返回测试成功。我的意思是,我在对数据库的所有3次调用中都有断点,但是IntelliJ调试器会在完成对数据库的第一次调用后立即退出。为什么会这样?如何使用IntelliJ调试器测试此行为?

我不确定我的答案是否满足您的期望,但这是一个已知的问题。问题在于
async
/
await
是一个相当复杂的宏,它在树上进行大量转换(您可以通过启用
-Xprint:
标志来检查输出)。不幸的是,现有的IDE(我正在使用Intellij和Ensime)都不能调试它,但我不熟悉它们的内部结构,无法详细解释它们为什么不能调试


根据我的经验,我找不到比本机更好的理解方法,因此您可以坚持使用本机语法或显式flatmap调用,这是很好的可调试性。

此构造可用于depdendant异步调用。 async/await添加了一些糖分使之更容易,但要手动形成,您可以这样做:

def dbMethodDependant : Future[T] = for {
  res1 <- firstCall
  res2 <- secondCall(res2)
  res3 <- thirdCall(res3)
} yield res3

Await.result(dbMethodDependant, forever)
def dbmethodedependent:Future[T]=for{

res1我在尝试使用async/await库时撞到自己的腿了吗?该死。我需要找到一些方法来测试它!@sparkr你可以用
await
或scalatest
在READY
调用时测试它们,但不进行调试。另外,请注意,在你的代码段未来不会并行运行,请阅读最后一个例子中的每个调用返回一个未来。为什么您认为它不会并行运行?@sparkr这与您编写它以理解它是一样的。请检查和。为了并行运行它,您需要在变量中有一个未来,并等待结果。这些方法是相互依赖的吗?还是没有关系?它们是相互依赖的这就是为什么我必须使用这个库