【发布时间】:2018-12-20 01:27:14
【问题描述】:
我正在使用 scanamo 查询 dynamodb,而我要做的就是检查 db 是否确实存在。我并不真正关心我得到的记录,只是没有错误。对于查询部分,我使用的是:
trait DynamoTestTrait extends AbstractDynamoConfig { def test(): Future[List[Either[DynamoReadError, T]]] = ScanamoAsync.exec(client)table.consistently.limit(1).scan())}
返回未来列表。我要评价第一个?列表中的项目,如果不是读取错误,则返回 true。
我认为这会起作用,但它没有:
val result = test() match {
case r: DynamoReadError => Future.successful(false)
case r: Registration => Future.successful(true)
}
我是 scala 的新手,所以在返回类型和事情上苦苦挣扎。这是一个 Play api 调用,所以我需要在某个时候评估那个布尔未来。像这样:
def health = Action {
val isHealthy = h.testDynamo()
val b: Boolean = Await.result(isHealthy, scala.concurrent.duration.Duration(5, "seconds"))
Ok(Json.toJson(TestResponse(b.toString)))
}
我认为这也可能是错误的,因为我不想使用 Await 但我也无法异步工作。 对不起,我有点迷路了。
当我尝试评估结果时,我只会收到一条关于未来的消息:
{
"status": 500,
"message": "Future(<not completed>) (of class scala.concurrent.impl.Promise$DefaultPromise)"
}
【问题讨论】:
-
结果是什么?我不完全确定您的数据库调用是如何工作的。但是您拥有的语法是结果将是案例中匹配的内容,然后返回到结果值中。所以它最有可能是真还是假?你能至少检查一下结果是什么吗?
-
我似乎无法检查任何中间值是什么,因为它们是期货。不知道我该怎么做。
-
阅读 Tim 的评论,您就会知道该怎么做。我忘了说结果是一个未来。要检查未来(结果),这就是你要做的 val futureResult = Await(result, 30 seconds); println(futureResult);但是蒂姆的解决方案更好,可以检查你所有的未来。如果你不了解左右.. 右基本上是试图检查它是否成功..那么那么是真的。并在它失败时离开。再次,检查蒂姆在下面的答案。
标签: scala playframework