我有以下Scala代码:
val status: Future[String] = Await.ready(Http(address OK as.String), 1 second)
我正在进行一个http
调用,并等待一秒钟后得到回答。
有人告诉我使用Await.ready
阻塞是不好的实践。
我很好奇可以使用什么来代替。
我可以使用for推导式吗?如何使用?
我有以下Scala代码:
val status: Future[String] = Await.ready(Http(address OK as.String), 1 second)
我正在进行一个http
调用,并等待一秒钟后得到回答。
有人告诉我使用Await.ready
阻塞是不好的实践。
我很好奇可以使用什么来代替。
我可以使用for推导式吗?如何使用?
阻塞异步操作通常是不好的,否则为什么要将其设计成异步呢?
您可以使用各种Future[T]
实现,例如在结果到达时注册继续执行。例如,假设您想将String
结果解析为Foo
对象。您可以这样做:
val result: Future[Foo] = Http(address OK as.String).map {
s => parseJson[Foo](s)
}
Future[T]
时,除非您同步阻塞,否则您将把它们沿执行调用链上升。for {
s <- Http(address OK as.String)
} yield (parseJson[Foo](s))
Await.ready
不是一个好的实践,因为它会阻塞程序。在大多数情况下,您可以组合和转换futures以达到所需的结果。def afterSomeTime(code: => Unit)(duration: FiniteDuration): Unit = {
someActorSystem.scheduler.scheduleOnce(duration) {
code
}
}
case class TimeoutException(msg: String) extends Exception(msg)
def timeout[T](future: => Future[T])(duration: FiniteDuration)(implicit ec: ExecutionContext): Future[T] = {
val promise = Promise[T]()
future.onComplete(promise tryComplete)
afterSomeTime {
promise tryFailure TimeoutException(s"Future timeout after ${duration.toString()}")
}(duration)
promise.future
}
Await.result
,因为上面的代码甚至无法编译。 - oxbow_lakes