gpt4 book ai didi

Scala 用于与 Future 一起使用的产量理解。如何等到 future 回来?

转载 作者:行者123 更新时间:2023-12-04 09:40:29 27 4
gpt4 key购买 nike

我有一个提供上下文的函数:

def buildContext(s:String)(request:RequestHeader):Future[Granite.Context] = {
.... // returns a Future[Granite.Context]
}

然后我有另一个函数,它使用 Context 返回一个 Option[Library.Document]:
def getDocument(tag: String):Option[Library.Document] = {
val fakeRequest = play.api.test.FakeRequest().withHeaders(CONTENT_TYPE -> "application/json")

val context = buildContext(tag)(fakeRequest)

val maybeDoc = context.getDocument //getDocument is defined on Granite.Context to return an Option[Library.Document]

}

如果 Future 已返回,此代码将如何考虑?我已经看到 for/yield 过去常常等待返回,但我一直认为 for/yield 只是将事物平面映射在一起,与等待 Futures 返回没有任何关系。我有点卡在这里,真的没有正确的问题要问!

最佳答案

其他两个答案具有误导性。一个 for yield在 Scala 中是一个编译器原语,它被转换为 mapflatMap链。请勿使用 Await如果你能避免它,这不是一个简单的问题。

您正在引入阻塞行为,而您尚未意识到阻塞时所造成的系统性损害。

说到Future , mapflatMap做不同的事情:

map
在 future 完成时执行。这是一种进行类型安全映射的异步方式。

val f: Future[A] = someFutureProducer
def convertAToB(a: A): B = {..}
f map { a => convertAToB(a) }

平面 map

是你用来链接事物的东西:
someFuture flatMap {
_ => {
someOtherFuture
}
}

上面的等价物是:
for {
result1 <- someFuture
result2 <- someOtherFuture
} yield result2

在 Play 中,您将使用 Async处理上述问题:
Async {
someFuture.map(i => Ok("Got result: " + i))
}

更新

我误解了您对 Play 的使用。尽管如此,它并没有改变任何东西。您仍然可以使您的逻辑异步。
someFuture onComplete {
case Success(result) => // doSomething
case Failure(err) => // log the error etc
}

异步思考的主要区别在于您总是必须 mapflatMap并在里面做所有其他事情 Future s 把事情做好。性能提升是巨大的。

你的应用越大, yield 就越大。

关于Scala 用于与 Future 一起使用的产量理解。如何等到 future 回来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22405039/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com